Merhabalar arkadaşlar. Bu yazıda sizlere TestNG kütüphanesinden bahsetmek ve örnek bir uygulama yapmak istiyorum. Eğer kısmet olursa da TestNG’nin resmi dökümantasyonunu baz alarak bir yazı dizisi hazırlamak istiyorum. O nedenle bu yazıyı TestNG kütüphanesine giriş yazısı olarak da düşünebilirsiniz 😊

TestNG Nedir?

İsmi Next Generation Test kelimelerinden türetilen TestNG JUnit ve NUnit kütüphanelerinden etkilenerek ve onlara göre daha fazla yetkinlik barındıran bir test kütüphanesidir. Java dünyası içerisinde en bilindik test koşturma aracı olarak JUnit’i düşünebiliriz. TestNG de JUnit’in bu tahtına göz dikmiş olan bir test kütüphanesidir.

TestNG kendini daha güçlü, daha fonksiyonel ve daha kolay olarak nitelendirmektedir. Bu özellikler için şunları örnek verebiliriz:

  • Notasyonlar
  • Testlerin kendine has Thread’lerde koşabilmesi
  • Multithread Safe Test Kodları
  • Esnek test konfigürasyonu
  • @DataProvider notasyonu sayesinde Data Driven Test
  • Parametrik yönteme destek
  • IDE’ler için Plugin desteği
  • Daha ileri esneklik için BeanShell desteği
  • Kendi içerisinde loglama desteği

Şimdi IDE’nizde bir Maven projesi açın ve pom.xml dosyanıza şu bağımlılık kodunu ekleyin:

<dependency>
	<groupId>org.testng</groupId>
	<artifactId>testng</artifactId>
	<version>6.8</version>
	<scope>test</scope>
</dependency>

Ben bu ve TestNG için gelecek diğer yazılarda NetBeans IDE kullanacağım. Size de tavsiye ederim 😁

Şimdi NetBeans IDE üzerinde projeye sağ tıklayıp New -> Other dedikten sonra gelen ekranda sol kısımdan Unit Tests‘i sağ kısımdan ise TestNG Case‘i seçelim ve bir herhangi bir isim verdiğiniz Test sınıfı oluşturalım.

NetBeans bizim için şöyle bir kod üretmiş olacak:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ilkaygunel.test;

import static org.testng.Assert.*;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;

/**
 *
 * @author ilkaygunel
 */
public class TestNGTestCase {
    
    public TestNGTestCase() {
    }

    // TODO add test methods here.
    // The methods must be annotated with annotation @Test. For example:
    //
    // @Test
    // public void hello() {}

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @BeforeMethod
    public void setUpMethod() throws Exception {
    }

    @AfterMethod
    public void tearDownMethod() throws Exception {
    }
}

Şimdi yukarıdaki bu kodu şu şekilde düzenleyelim ve inceleyelim:

package com.ilkaygunel.test;

import static org.testng.Assert.*;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class TestNGTestCase {

    @BeforeClass
    public static void setUpClass() throws Exception {
        System.out.println("setUpClass() metodu çalıştı!");
    }

    @BeforeMethod
    public void setUpMethod() throws Exception {
        System.out.println("setUpMethod() metodu çalıştı!");
    }
    
    @Test
    public void test1(){
        System.out.println("Test1() Metodu Çalıştı");
    }
    
    @Test
    public void test2(){
        System.out.println("Test2() Metodu Çalıştı");
    }

    @AfterMethod
    public void tearDownMethod() throws Exception {
        System.out.println("tearDownMethod() metodu çalıştı!");
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
        System.out.println("tearDownClass() metodu çalıştı!");
    }
}

Kod içerisinde test koşturumu için kullanılan bir çok notasyon arasından 5 tanesini görüyoruz. Notasyonlar şu manalara gelmektedir:

  • @BeforeClass: Bu notasyon class’ımız build edildiğinde ve sınıf içerisinden ya da bu sınıftan kalıtılan sınıf içerisinden herhangi bir test metodu çalışmadan hemen önce devreye girer. Dikkat etmemiz gereken nokta ise bu notasyon ile işretli metot her test için ayrı ayrı çalışmaz, bir kez çalışır.
  • @BeforeMethod: Bu notasyon ile işaretli metot bu sınıf ve bu sınıftan kalıtılan her bir test metodunun koşumundan hemen önce çalışır. Yani her test metodu için ayrı ayrı çalışacaktır.
  • @Test: Test case’lerimizi @Test notasyonu ile işaretli metotlarımızın içinde yazıyoruz. Bu Java sınıfımı Test sınıfı olarak koşturduğumuzda çalışacak merkezi noktalar bunlardır.
  • @AfterMethod: Bu notasyon ile işaretli metot bu sınıf ve bu sınıftan kalıtılan her bir test metodunun koşumunun hemen ardından devreye girer. Yani her test metodu için ayrı ayrı çalışacaktır.
  • @AfterClass: Bu notasyon artık bu sınıf içerisindeki tüm test metotları ve test metotları sonrasında koşacak metotlar bittiğinde devreye girer ve testlerin son aşamasında ne yapılması gerekiyorsa onu yapar. Örneğin Selenium’da web driver’ın kapatılması gibi.

Bu sınıfa sağ tıklayıp Test File seçeneğine tıkladığımızda sınıfızdaki test case’leri koşacak. Şöyle bir ekran çıktısı gelecek:

Ekran çıktısında gördüğümüz ve yukarıda bahsettiklerimiz doğrultusunda beklediğimiz gibi setUpClass() ve tearDownClass() metotları bir kez, setUpMethod() ve tearDownMethod() metotlarımız iki adet @Test ile işaretli metodumuz olduğu için 2 defa çalıştılar.

Bu yazıda anlatacaklarım bu kadar arkadaşlar. TestNG kütüphanesine böylece bir giriş yapmış olalım. Yazının başlarında da dediğim gibi resmi dökümana göre devamını getirmeye çalışacağım.

Görüşmek Üzere

Selam ve Sevgilerimle