SpecFlow ile Davranış Güdümlü Geliştirme
Merhaba arkadaşlar, bu yazımda sizlere Selenium WebDriver ile SpecFlow kullanarak davranış güdümlü geliştirme yaklaşımını anlatmaya çalışacağım. Davranış güdümlü geliştirmenin ne olduğunu bir önceki yazımda anlatmaya çalıştım buradan ilgili makaleye ulaşabilirsiniz.
SpecFlow Nedir ?
Java programlama dili için geliştirilen Cucumber kütüphanesinin Microsoft .NET platformundaki karşılığıdır. SpecFlow ile de Cucumber’da olduğu gibi Gherkin dilini kullanarak test senaryolarımızı yazabiliriz.
Test Projesinin Oluşturulması
Visual Studio üzerinden Unit Test Project (.NET Framework) projesi oluşturdum. Projeyi oluşturduktan sonra UnitTest1.cs sınıfını silmeyi unutmayın.

SpecFlow Eklentisinin Kurulması
- Projeyi oluşturduktan sonra Tools menüsünden Extensions and Updates seçeneğine basın. Açılan ekrandan Online bölümüne basın ve arama kutusuna SpecFlow anahtar kelimesini yazarak ilgili eklentiyi kurun. Kurulumun tamamlanması için Visual Studio’nun kapatılıp tekrar açılması gerekmektedir.

- Solution Explorer bölümünden References kısmına sağ tıklayın Manage NuGet Packages seçeneğine basın. Aşağıdaki kütüphaneleri projenize kurun.
- SpecFlow
- SpecRun.SpecFlow
- SpecFlow.Tools.MsBuild.Generation
- Selenium.WebDriver
- Selenium.Chrome.WebDriver
Proje Dizin Yapısının Oluşturulması
Projeye Collections, Steps ve Features adında üç tane klasör oluşturdum. Dizin yapısı aşağıdaki gibidir.
Feature Dosyasının Oluşturulması
Features klasörünün üzerinde iken sağ tıklayın Add / New Item / SpecFlow Feature File seçin, feature dosyasına bir ad belirleyin ve Add butonuna basın.

Feature dosyasını oluşturduktan sonra Gherkin dilini kullanarak basit bir oturum açma senaryosu oluşturdum.

Feature dosyasında Given-When-Then adımlarını tanımlandıktan sonra bu adımlara karşılık gelen test adımlarının oluşturulması gerekmektedir. Bunun için feature dosyasında boş bir alana sağ tıklayın Generate Step Definitions seçeneğine basın.
Açılan ekranda Generate butonuna basın.
Feature dosyasına yazdığım test adımlarına ait test methodlarının otomatik olarak oluşturulduğunu gördüm.

BaseCollection Sınıfının Oluşturulması
Selenium WebDriver nesnesini tüm sınıflarda kullanabilmek için Collections klasörünün içerisine BaseCollection adında bir sınıf oluşturdum. Sınıfa ait kod bloğu aşağıdaki gibidir:
using OpenQA.Selenium; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SpecFlowFirstExample.Collections { public class BaseCollection { public static IWebDriver webDriver { get; set; } } }
LoginPageCollection Sınıfının Oluşturulması
Test edeceğimiz login sayfasının link, kullanıcı adı ve parola bilgilerini tanımlayabilmek için yine Collections klasöründe LoginPageCollection adında bir sınıf oluşturdum. Sınıfa ait kod bloğu aşağıdaki gibidir:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SpecFlowFirstExample.Collections { public class LoginPageCollection { public static string loginPageUrl = "http://localhost:8383/DemoLogin/index.html"; public static string correctUsername = "admin"; public static string correctPassword = "123456"; } }
LoginStep.cs Sınıfının Oluşturulması
Feature dosyasından otomatik olarak oluşturulan LoginStep.cs sınıfının içerisindeki methodları Selenium WebDriver kütüphanesinden faydalanarak doldurdum. LoginStep.cs sınıfına ait kod bloğu aşağıdaki gibidir:
using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using SpecFlowFirstExample.Collections; using System; using TechTalk.SpecFlow; namespace SpecFlowFirstExample.Features { [Binding] public class LoginSteps : BaseCollection { [Given(@"I'm going to the login page")] public void GivenIMGoingToTheLoginPage() { webDriver = new ChromeDriver(); webDriver.Manage().Window.Maximize(); webDriver.Navigate().GoToUrl(LoginPageCollection.loginPageUrl); } [Given(@"I'm filling in the username and password fields")] public void GivenIMFillingİnTheUsernameAndPasswordFields() { webDriver.FindElement(By.Id("kullaniciAdi")).SendKeys(LoginPageCollection.correctUsername); webDriver.FindElement(By.Id("parola")).SendKeys(LoginPageCollection.correctPassword); } [When(@"I click the login button")] public void WhenIClickTheLoginButton() { webDriver.FindElement(By.Id("btnGirisYap")).Click(); } [Then(@"I see the home page")] public void ThenISeeTheHomePage() { Assert.AreEqual(webDriver.Title, "Home Page"); webDriver.Quit(); } } }
Kodlama bittikten sonra Solution Explorer ekranında projenin üzerinde sağ tıklayarak Build komutunu veriyoruz. Test Explorer bölümünden de testi çalıştırıyoruz. Sonuç aşağıdaki gibidir:
Not: Kullandığımız SpecFlow kütüphanesi evaluation mod olduğu için testlerin çalıştırılması her seferinde birkaç saniye geçikmeli olacaktır. Bunu aşmak için lisans satın alınması gerekmektedir.
Build işlemi sırasında Custom tool error: Generation error: Version conflict – SpecFlow Visual Studio extension attempted to use SpecFlow code-behind generator 1.9, but ‘ProjeAdı’ references SpecFlow 3.0. hata mesajı alırsanız aşağıdaki adımları uygulayarak hatayı giderebilirsiniz.

Visual Studio’da Tools / Options seçeneğine basın. Açılan ekrandan SpecFlow / General / Legacy / Enable SpecFlowSingleGenerator seçeneğini False olarak değiştirin. OK butonuna basarak ayarı kaydedin.

Oluşturduğumuz feature dosyasına sağ tıklayın Properties seçeneğine basın. Custom Tool kısmında yazan SpecFlowSingleFileGenerator parametresini silin. Ardından tekrar Build komutu verin. Sorunsuz şekilde derlendiğini göreceksiniz 🙂
Faydalı olması dileğiyle…