Selenium WebDriver’da Veri Güdümlü Test Yaklaşımı

Merhaba arkadaşlar bu yazımda Java programlama dilini kullanarak Selenium WebDriver’da Veri Güdümlü test yaklaşımını anlatmaya çalışacağım. Veri Güdümlü Test yaklaşımından daha önce bahsetmiştim bu nedenle tekrar değinmeyeceğim.

NetBeans ile Projenin Oluşturulması

Java programlama dili için ücretsiz olan NetBeans IDE uygulamasını kullanacağım. File / New Project seçeneğine basarak proje oluşturma sihirbazını açtım. Categories kısmından Java, Projects kısmından Java Class Library seçeneklerini işaretleyerek Next butonuna bastım.

NetBeans / New Project

Sonraki ekrandan proje adını belirttim ve Finish butonuna bastım.

NetBeans / Project Name and Location

NetBeans IDE’de proje oluşturma tamamlandı. Sıradaki işimiz kullanacağımız kütüphanelerin projeye dahil edilmesi olacak.

Kütüphanelerin Proje Eklenmesi

Projeye üç kütüphane ekleyeceğiz bunların indirme linkleri aşağıdadır.

Libraries klasörüne sağ tıkladım Add Jar/Folder seçeneğine bastım. İndirdiğim kütüphane dosyalarını (.jar) seçerek Open butonuna bastım.

NetBeans / Add JAR/Folder

Kütüphaneleri ekledikten sonra Libraries klasörünün son durumu aşağıdaki gibi olacaktır.

Proje Dizin Yapısının Oluşturulması

Projede Page Object Model yaklaşımını kullanılacağım için dizin yapısını buna göre oluşturacağım. Test Packages klasörünün altına üç tane package ekledim. ddt.collections paketinde test edilecek her sayfa için statik tanımlanacak değişkenler tutulacaktır. ddt.pages paketinde test edilecek her sayfa için bir sınıf oluşturulacak ve ilgili methodlar burada tanımlanacaktır. ddt.tests paketinde ise test senaryoları oluşturulacaktır.

Eğer projeyi oluşturduğunuzda Test Packages klasörü oluşmazsa projenizin üzerinde iken sağ tıklayın ve Unit Tests kısmından JUnit Test ekleyin bu sayede Test Packages klasörü oluşacaktır.

BaseTest sınıfının Oluşturulması

ddt.tests klasörünün altına BaseTest adında bir sınıf oluşturdum. Bu sınıfta tüm testler için ortak kullanılacak işlemleri yapıyor olacağım. showAlert() methodu test sonucunu kontrol etmek amacıyla oluşturuldu kullanıcı tanımlama işleminden sonra alınacak uyarı mesajı bu method sayesinde ilgili sınıfa gönderilecektir. Ayrıca selectBrowser() methodu ile de test başlamadan önce seçilen tarayıcıya göre ilgili if bloğuna girerek tarayıcı ayarları yapılacaktır. BaseTest sınıfına ait kodlar aşağıdaki gibidir.

package ddt.tests;

import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

public class BaseTest {

    protected WebDriver driver;

    public enum browsers {

        Chrome,
        Firefox,
        Edge,
        IE
    }

    public void selectBrowser(browsers browser) {
        if (browser == browsers.Chrome) {
            System.setProperty("webdriver.chrome.driver", "C:/selenium-driver/chromedriver.exe");
            driver = new ChromeDriver();
        } else if (browser == browsers.Firefox) {
            System.setProperty("webdriver.gecko.driver", "C:/selenium-driver/geckodriver.exe");
            driver = new FirefoxDriver();
        } else if (browser == browsers.Edge) {
            System.setProperty("webdriver.edge.driver", "C:/selenium-driver/MicrosoftWebDriver.exe");
            driver = new EdgeDriver();
        } else {
            System.setProperty("webdriver.ie.driver", "C:/selenium-driver/IEDriverServer.exe");
            driver = new InternetExplorerDriver();
        }
    }

    public void navigateUrl(String url) {
        driver.get(url);

    }

    public String showAlert() {
        return driver.switchTo().alert().getText();
    }

    @Before
    public void setUp() {
        selectBrowser(browsers.Chrome);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }

    @After
    public void tearDown() {
        driver.quit();
    }
}

BaseCollection Sınıfının Oluşturulması

ddt.collections klasörünün altına BaseCollection adında bir sınıf oluşturdum. Bu sınıfta excel (csv) dosyasını okuyabilmek için csvRead() adında bir method yazdım. Bu methoda vereceğiniz excel dosyası içindeki virgül ile ayrılmış veriler test yürütme esnasında kullanılacaktır. BaseCollection sınıfına ait kodlar aşağıdaki gibidir. Ayrıca örnek excel dosyası ve test edeceğim ekrana ait görüntüleri de kodun altına ekliyor olacağım.

package ddt.collections;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BaseCollection {

    public static List<String[]> csvRead(String file) {
        List<String[]> data = new ArrayList<>();
        String row;

        try {
            BufferedReader buffer = new BufferedReader(new FileReader(file));
            while ((row = buffer.readLine()) != null) {
                String[] line = row.split(",");
                data.add(line);
            }
        } catch (FileNotFoundException ex) {
            System.out.println("File not found." + ex);
        } catch (IOException ex) {
            System.out.println("File not read." + ex);
        }

        return data;
    }
}
kullanici-listesi.csv
Test Edilecek Ekran

KullaniciTanimlamaPage Sınıfının Oluşturulması

ddt.pages klasörünün altına KullaniciTanimlamaPage adında bir sınıf oluşturdum. Bu sınıfta test edeceğim kullanıcı tanımlama sayfasına ait bileşenlerin (inputbox, radio button, dropdown menu, button) locator bilgilerine yer vereceğim. Ayrıca kullanıcı tanımlamak için ilgili methodları da burada oluşturacağım. KullaniciTanimlamaPage sınıfına ait kodlar aşağıdaki gibidir.

package ddt.pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.Select;

public class KullaniciTanimlamaPage {

    private final WebDriver driver;
    Select selectUnvan = null;
    By inputAd = By.id("txtAd");
    By inputSoyad = By.id("txtSoyad");
    By rdErkek = By.id("radioErkek");
    By rdKadin = By.id("radioKadin");
    By drpUnvan = By.id("drpUnvan");
    By btnKaydet = By.id("btnKaydet");

    public KullaniciTanimlamaPage(WebDriver driver) {
        this.driver = driver;
    }

    public void kullaniciEkle(String ad, String soyad, String cinsiyet, String unvan) throws InterruptedException {

        driver.findElement(inputAd).sendKeys(ad);
        Thread.sleep(1000);
        driver.findElement(inputSoyad).sendKeys(soyad);
        Thread.sleep(1000);

        //Cinsiyet seçimi
        if (!cinsiyet.equals("Erkek")) {
            driver.findElement(rdKadin).click();
        } else {
            driver.findElement(rdErkek).click();

        }
        Thread.sleep(1000);

        //Ünvan seçimi
        selectUnvan = new Select(driver.findElement(drpUnvan));
        switch (unvan) {
            case "Seçiniz":
                selectUnvan.selectByIndex(0);
                break;
            case "Proje Mühendisi":
                selectUnvan.selectByIndex(1);
                break;
            case "Yazılım Test Uzmanı":
                selectUnvan.selectByIndex(2);
                break;
            case "Takım Lideri":
                selectUnvan.selectByIndex(3);
                break;
            case "Müdür":
                selectUnvan.selectByIndex(4);
                break;
            default:
                selectUnvan.selectByIndex(5);
                break;
        }
        Thread.sleep(1000);
        driver.findElement(btnKaydet).click();
        Thread.sleep(1000);
    }
}

KullaniciTanimlamaCollection Sınııfının Oluşturulması

ddt.collections klasörünün altına KullaniciTanimlamaCollection adında bir sınıf oluşturdum. Bu sınıfta test edeceğim sayfaya ait statik değişkenleri (URL, Uyarı mesajları vb.) tanımlayacağım. İlgilili sınıfa ait kodlar aşağıdaki gibidir.

package ddt.collections;

public class KullaniciTanimlamaCollection {

    public static final String URL = "http://localhost:8383/DemoLogin/HomePage.html";
    public static final String ZORUNLU_ALAN_MESAJ = "Lütfen zorunlu alanları doldurunuz / seçiniz.";
    public static final String BASARILI_TANIMLAMA_MESAJ = "Kullanıcı kaydetme işlemi başarıyla tamamlandı.";
}

KullaniciTanimlamaTest Sınıfının Oluşturulması

ddt.tests klasörünün altına KullaniciTanimlamaTest adında bir sınıf oluşturdum. Bu sınıfta test edeceğim sayfaya ait test kodları yer alacaktır. @RunWith(value = Parameterized.class) kodu ile ilgili sınıf için veri kaynağı olacak method belirtilmektedir. Veri kaynağı olacak method içinse @Parameterized.Parameters anatasyonu kullanıldı. Test sonucunu kontrol edebilmek içinse JUnit kütüphanesine ait olan Assert.assertEquals() methodunu kullandım. Bu method ile beklenen ve gerçekleşen sonuçları karşılaştırarak çalıştırdığınız testin sonucunu görebilirsiniz. İlgili sınıfa ait test kodları aşağıdaki gibidir.

package ddt.tests;

import ddt.collections.BaseCollection;
import ddt.collections.KullaniciTanimlamaCollection;
import ddt.pages.KullaniciTanimlamaPage;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(value = Parameterized.class)
public class KullaniciTanimlamaTest extends BaseTest {

    String ad;
    String soyad;
    String cinsiyet;
    String unvan;

    public void goToUrl() {
        navigateUrl(KullaniciTanimlamaCollection.URL);
    }

    @Parameterized.Parameters
    public static List<String[]> getData() {
        return BaseCollection.csvRead("C:\\selenium-driver\\kullanici-listesi.csv");
    }

    @Test
    public void kullaniciEkleTest() throws InterruptedException {
        goToUrl();
        new KullaniciTanimlamaPage(driver).kullaniciEkle(ad, soyad, cinsiyet, unvan);
        Assert.assertEquals(KullaniciTanimlamaCollection.BASARILI_TANIMLAMA_MESAJ, showAlert());

    }

    public KullaniciTanimlamaTest(String ad, String soyad, String cinsiyet, String unvan) {
        this.ad = ad;
        this.soyad = soyad;
        this.cinsiyet = cinsiyet;
        this.unvan = unvan;
    }

}

@Test anatosyonu kullanarak oluşturduğumuz test methodunun üzerinde iken sağ tıkladım ve Run File komutunu verdim.

NetBeans / Run File

Örnek excel dosyamda 4 adet kayıt olduğu için ilgili test kodu 4 defa çalıştı ve başarılı oldu. Bir sonraki yazımda görüşmek üzere esen kalın.

NetBeans / Test Result

Faydalı olması dileğiyle…