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.

POM.xml

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.

IntelliJ IDEA- Cucumber Plugin Installation

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.

Proje dizin yapısı

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.

New Feature File

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

Login Feature File

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.

Run Test Project

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

Test Result

Faydalı olması dileğiyle…