Cucumber ile Behaviour Driven Development (BDD)

Merhaba arkadaşlar, Mobilhanem.com üzerinde Selenium ile Test Otomasyonu Geliştirme serimizin on birinci dersinde Cucumber ile Behaviour Driven Development (BDD) konusuna değineceğim. Bir önceki dersimizde Test Otomasyon Süreçlerinde Loglama konusunu ele almıştık. Bu dersimizde Cucumber , Behaviour Driven Development (BDD) ve Test Driven Development (TDD)  ile ilgili konuları ele alacağız.

Cucumber ile Behaviour Driven Development (BDD)

BEHAVIOUR DRIVEN DEVELOPMENT (BDD) NEDİR ?

Behaviour Driven Development (BDD), 2009 yılında Dan North tarafından ortaya çıkmıştır. Behaviour Driven Development’ın (BDD) asıl çıkış amacı Test Driven Development’da (TDD) yer alan karmaşıklığı azalmaktır. Behaviour Driven Development’ın (BDD)  Test Driver Development’dan (TDD) farkı, bir sistemin davranışlarını günlük konuşma dili şeklinde yazılmasıdır. Buradaki yaklaşım yazılım geliştirme süreçlerinin test odaklı yürütülmesini sağlayan bir yaklaşımdır. Behaviour Driven Development (BDD), Test Driven Development (TDD) gibi geliştirme yapılmadan önce test kodlarının önceden yazılması sonrasında ise buna bağlı olarak proje geliştirme kodlarının yazılma prensibidir.

 

CUCUMBER NEDİR ?

Cucumber ile Behaviour Driven Development (BDD) - İşleyiş
Cucumber ile Behaviour Driven Development (BDD) – İşleyiş

 

Cucumber, Behaviour Driven Development (BDD) yaklaşımı için kullanılabilen açık kaynak kodlu bir araçtır. Cucumber, Behaviour Driven Development (BDD) süreçlerini temel alır. Test yazımı oldukça basittir hatta Cucumber’in en basit tanımı da düz metin olarak yazılan test senaryolarını otomatize testlere dönüştüren bir araç olarak geçmektedir. Cucumber bu basit söz dizimini kullanabilmemiz için Gherkin dilini kullanmaktadır. Bu dilin en büyük avantajı herkes tarafından yazılan senaryoların anlaşılabilir olmasıdır.

Uygulama kullanımı yukarıda ki resimde de anlaşılacağı üzerine iki kısımdan oluşmaktadır. Bunlar; Features ve Glue Code’dır. Farklı bir programlama diline de kolayca dönüştürülebilmektedir. Ayrıca Cucumber Terminolojisinde aşağıda yer alan başlıklara da yer verilmektedir.

Feature ,Scenario ,Given-When-Then ,And . Burada yer alan başlıkları daha iyi anlamak için şöyle düşünebiliriz. Feature kısmında  bir davranış tanımlıyoruz (örn : uygulama için ana sayfayı görüntüle, sayfanın yüklendiğine kullanıcı olarak emin ol,  ana sayfayı görmek istiyorum vb.) . Scenario kısmında, feature kısmında yer alan isterimiz için uygun olan senaryomuzu oluşturuyoruz. Aşağıda yer alan görseli bu durum için inceleyebilirsiniz.

Cucumber ile Behaviour Driven Development (BDD) - Örnek Senaryo
Cucumber ile Behaviour Driven Development (BDD) – Örnek Senaryo

Gherkin Nedir ?

Yukarıda yer alan görselde aslında bir proje için yazılmış olan davranışları görüyoruz. Proje de bu davranışların yer aldığı .feature uzantılı bir Gherkin dosyası yer almaktadır. Bu dosyada ilgili özelliğin nasıl davranacağı ile ilgili tanımlamalar mevcuttur. Given, ön koşul durumunu tanımlar, When olayı Then ise when anahtar kelimesinde yer alan olayı  sonuçlandırır.

Buradaki konuları anladıktan sonra pekiştirmek için bir örnek yapalım. Öncellikle Intellij Ide IDE’sini kullanarak bir maven projesi oluşturalım. Oluşturmuş olduğumuz projenin pom.xml sayfasına aşağıda yer alan kodları ekleyelim.

  <dependencies>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java8</artifactId>
            <version>5.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>5.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>5.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.1.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Ardından test klasörüne sağ tıklayıp 3 tane package oluşturacağız. Bunlar ; Features, Runner ve TestCases’dir.

Cucumber ile Behaviour Driven Development (BDD) - Proje Package Oluşturulması
Cucumber ile Behaviour Driven Development (BDD) – Proje Package Oluşturulması

 

Features package’ne sağ tıklayarak New->File diyoruz ve isim olarak Register.feature yazıyoruz. Sonrasında ise bizim ortamımızda cucumber ve gherkin pluginleri olmadığı için sayfada bir uyarı verecektir ve bu uyarıda yer alan install plugins seçeneğine tıklayarak ilgili pluginleri indirebiliriz.

Cucumber ile Behaviour Driven Development (BDD) - Eklenti kurulumları
Cucumber ile Behaviour Driven Development (BDD) – Eklenti kurulumları

 

İndirme tamamlandıktan sonra Login.feature dosyamıza ilgili test senaryomuzu yazıyoruz. Burada ki örnekte register işlemi için örnek bir test senaryosu oluşturulmuştur.

@LoginTest
  Feature: Register Feature
    Scenario: Correct Register Test
      Given I'm going to the register page
      When I'm filling in the username, email, password and confirm password field
      And I click the submit button
      Then I see the home page

TestCases package’mıza sağ tıklayarak LoginTest sınıfı oluşturuyoruz. Oluşturduğumuz bu sınıfta eski örneklerimizde yapmış olduğumuz Selenium WebDriver ile ilgili tanımlamalarımızı yapıyoruz. Bu tanımlamaları yaptıktan sonra Register.feature’da yer alan  Given-When-And-Then tanımlarımızı senaryomuza bağlı olarak oluşturmamız gerekmektedir. Burada dikkat edilmesi gereken durum, tanımlamış olduğumuz senaryoları aynı şekilde burada da tanımlamamız gerekmektedir aksi taktirde senaryolar uyuşmadığı için hata alırız.

package TestCases;

import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.junit.Assert;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import static java.util.concurrent.TimeUnit.SECONDS;

public class LoginTest {
    public static WebDriver driver;
    public static String baseUrl;
    public static String userName = "aybuke";
    public static String email = "[email protected]";
    public static String confirmEmail = "[email protected]";
    public static String userPassword = "mobilhanem123";
    public static String confirmPassword = "mobilhanem123";

    @Given("I'm going to the register page")
    public void iGoingToTheLoginPage() {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\aybukeka\\Desktop\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, SECONDS);
        driver.manage().timeouts().pageLoadTimeout(200, SECONDS);
        driver.manage().window().maximize();
        baseUrl = "http://test.mobilhanem.com.tr/registration/";
        driver.get(baseUrl);
    }
    @When("I'm filling in the username, email, password and confirm password field")
    public void iFillingTheUsernameAndPasswordFields() {
        driver.findElement(By.id("user_login")).sendKeys(userName);
        driver.findElement(By.id("user_email")).sendKeys(email);
        driver.findElement(By.id("user_pass")).sendKeys(userPassword);
        driver.findElement(By.id("user_confirm_password")).sendKeys(confirmPassword);
    }

    @And("I click the submit button")
    public void iClickTheLoginButton() {
        driver.findElement(By.xpath("//button[@type='submit']"));
    }

    @Then("I see the home page")
    public void iSeeTheHomePage() {
        Assert.assertEquals(driver.getTitle(), "Registration – Test Mobilhanem");
        driver.quit();
    }

}

Bu sınıfta yapmamız gereken işlemler bittikten sonra testimizi çalıştırma aşamasına geçmemiz gerekmektedir. Bunun için Runner package’nı oluşturmuştuk. Bu package içerisine TestRunner isimli bir sınıf oluşturalım.

package Runner;

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(features = "src\\test\\java\\Features", glue = {"TestCases"})
public class TestRunner {
}

Yukarıda gördüğünüz gibi çalıştırılacak olan feature’n pathini ve glue yani test ile ilgili kodlamamızın bulunduğu package ismini veriyoruz. Çalıştırmak için TestRunner.java ‘da sağ tıklayıp Run diyebiliriz. Sonuç ekranında test senaryomuzda pass ve fail ile ilgili sonuçları görebiliriz.

Cucumber ile Behaviour Driven Development (BDD) - Test Sonucu
Cucumber ile Behaviour Driven Development (BDD) – Test Sonucu

 

Mobilhanem.com da Selenium ile Test Otomasyonu Geliştirme serisinin bu dersinde  dersimizin sonuna geldik. Eksik ya da yanlış gördüğünüz veya anlamadığınız yerler için çekinmeden ulaşabilirsiniz.

Tüm Selenium derslerimiz için tıklayınız.

28

Sevde Aybüke Kaleli

DevOps Engineer at Evam, M.Sc.

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?