Cucumber ile Davranış Güdümlü Geliştirme
Merhaba arkadaşlar, bu yazımda sizlere Selenium WebDriver ile Cucumber kullanarak davranış güdümlü geliştirme yaklaşımını anlatmaya çalışacağım.
Davranış Güdümlü Geliştirme Nedir ?
Davranış güdümlü geliştirme (BDD) yaklaşımı ilk olarak 2009 yılında Dan North tarafından ortaya atılmıştır. Bu yaklaşım yazılım geliştirme süreçlerine daha test odaklı bakmamızı sağlamaktadır. Test güdümlü geliştirmeden (TDD) farkı bir sistemin davranışlarını projenin tüm paydaşlarının anlayabileceği günlük konuşma dili şeklinde yazılmasıdır. Böylece karmaşık test kodlarının tüm paydaşlar tarafından anlaşılmasını kolaylaştıracaktır. Bu yaklaşım için Java tarafından bu makalemizin konusu olan Cucumber, Microsoft .NET tarafında ise SpecFlow kütüphaneleri kullanılmaktadır.
Cucumber Nedir ?
Türkçe karşılığı pek havalı olmayan 🙂 bu araç BDD yaklaşımı için kullanılmakta olan açık kaynak kodlu bir kütüphanedir. Davranışları yazabilmek için basit bir kaç anahtar kelimesi ve formatı olan Gherkin adında bir dil kullanılmaktadır. Bu dilin en büyük artısı günlük bir dil kullanılarak yazıldığı için okuyan herkes tarafından kolaylıkla anlaşılabilir olmasıdır.
Gherkin
Projelerimizde her bir davranış için .feature uzantılı bir Gherkin dosyası oluşturulur. Bu feature dosyasına ilgili özelliğin farklı durumlardaki davranışları tanımlanır. Given anahtar kelimesi ile ön koşul yani başlangıç durumu tanımlanır, When anahtar kelimesi ile olayı Then anahtar kelimesi ile de sonuç tanımlanır. Given-When-Then adımları ile Scenario oluşturulur.
Test Projesinin Oluşturulması
Java programlama dili için IDE olarak JetBrains firmasına ait olan IntelliJ IDEA programının ücretsiz sürümü olan Community sürümünü kullanacağım. IntelliJ IDEA’da Maven projesi oluşturdum ve Selenium WebDriver, Cucumber ve JUnit kütüphanelerine ait maven repositorylerini pom.xml’e ekledim. Pom.xml dosyasının son hali aşağıdaki gibidir.

Cucumber Eklentisinin Kurulması
IntelliJ IDEA’da File menüsünden Settings seçeneğine basın. Açılan ayarlar penceresinde yer alan Plugins seçeneğine basın. Arama kısmına cucumber ve gherkin anahtar kelimelerini aratarak ilgili eklentileri kurun. Kurulum tamamlandıktan sonra IntelliJ IDEA’yı restart edin.

Proje Dizinlerinin Oluşturulması
Proje oluşturulduğunda otomatik olan gelen test > java dizinin altına feature dosyaları için Features, test senaryoları için TestCases ve yazdığımız test senaryolarını çalıştırmak için oluşturulacak runner sınıfı için Runner adında birer package oluşturdum. Projenin dizin yapısı aşağıdaki gibidir.
Feature Dosyasının Oluşturulması
Oluşturduğum Features adındaki package üzerindeyken sağ tıklayıp New / File diyoruz ve file name alanına feature dosyamızın adını yazıyorum. Uzantı olarak .feature yazmanız gerekmektedir.
Feature dosyasını oluşturduktan sonra Gherkin dilini kullanarak basit bir oturum açma senaryosu oluşturdum.

Test Case Sınıfının Oluşturulması
Feature dosyasında Given-When-Then adımları tanımlandıktan sonra bu adımlara karşılık gelen test senaryolarının yazılması gerekmektedir. Bu adımları isterseniz kullandığınız IDE tarafından otomatik oluşturabilirsiniz. Ben manuel olarak oluşturmayı tercih ediyorum. Bunun için öncelikle TestCases package’ının altına LoginTest adında bir sınıf oluşturdum. LoginTest sınıfına ait kod blogu aşağıdaki gibidir.
package TestCases; import cucumber.api.java.en.And; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class LoginTest { protected WebDriver driver; static String loginPageUrl = "http://localhost:8383/DemoLogin/index.html"; static String username = "admin"; static String password = "123456"; @Given("I'm going to the login page") public void iGoingToTheLoginPage() { System.setProperty("webdriver.chrome.driver", "C:/driver/chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get(loginPageUrl); } @When("I'm filling in the username and password fields") public void iFillingTheUsernameAndPasswordFields() { driver.findElement(By.id("kullaniciAdi")).sendKeys(username); driver.findElement(By.id("parola")).sendKeys(password); } @And("I click the login button") public void iClickTheLoginButton() { driver.findElement(By.id("btnGirisYap")).click(); } @Then("I see the home page") public void iSeeTheHomePage() { Assert.assertEquals(driver.getTitle(), "Home Page"); driver.quit(); } }
Runner Sınıfının Oluşturulması
Test projemizi çalıştırabilmemiz için daha önce oluşturduğumuz Runner package’nın altına TestRunner adında bir sınıf oluşturdum. @CucumberOptions etiketinde yer alan features için yol olarak feature dosyalarınızın yer aldığı package’ın yolunu, glue için ise test senaryolarınızın olduğu package’ın ismini vermelisiniz.
package Runner; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions(features = "src\\test\\java\\Features", glue = {"TestCases"}) public class TestRunner { }
Projenin Çalıştırılması
Oluşturduğum TestRunner sınıfında Run (CTRL + SHIFT + F10) komutunu vererek test projemizi çalıştırabiliriz.

Proje çalıştırıldığında sonuç aşağıdaki gibi görünmektedir.

Faydalı olması dileğiyle…