İçeriğe geç

TestNG - DataProvider Kullanımı

TestNG’de DataProvider özelliği, bir test metoduna farklı veri setlerini parametre olarak geçmek için kullanılır.
Bu sayede aynı testi farklı verilerle çalıştırabilir, data-driven testing (veri odaklı test) yaklaşımını uygulayabiliriz.


Bir @DataProvider metodu, bir test metoduna test verilerini sağlar.
Her veri seti için test metodu bir kez çalıştırılır.

@DataProvider(name = "data")
public Object[][] provideData() {
return new Object[][] {
{ "Ahmet", 25 },
{ "Ayşe", 30 },
{ "Mehmet", 40 }
};
}

Yukarıdaki örnekte, provideData() metodu 3 farklı veri seti döndürür.
Bu veriler, Object[][] tipinde döndürülmelidir.


Bir test metoduna DataProvider tanımlamak için @Test anotasyonuna dataProvider özelliği eklenir.

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderExample {
@DataProvider(name = "userData")
public Object[][] provideData() {
return new Object[][] {
{ "Ali", "12345" },
{ "Veli", "abcde" },
{ "Ayşe", "pass123" }
};
}
@Test(dataProvider = "userData")
public void testLogin(String username, String password) {
System.out.println("Kullanıcı: " + username + " | Şifre: " + password);
}
}

🧩 Çıktı:

Kullanıcı: Ali | Şifre: 12345
Kullanıcı: Veli | Şifre: abcde
Kullanıcı: Ayşe | Şifre: pass123

🧷 Farklı Sınıftan DataProvider Kullanımı

Section titled “🧷 Farklı Sınıftan DataProvider Kullanımı”

DataProvider metodunu başka bir sınıfta tanımlayabiliriz.
Bunun için dataProviderClass parametresi kullanılır.

// Data sağlayan sınıf
package data;
import org.testng.annotations.DataProvider;
public class TestData {
@DataProvider(name = "userCredentials")
public Object[][] getCredentials() {
return new Object[][] {
{ "admin", "admin123" },
{ "user", "user123" }
};
}
}
// Test sınıfı
package tests;
import org.testng.annotations.Test;
import data.TestData;
public class LoginTest {
@Test(dataProvider = "userCredentials", dataProviderClass = TestData.class)
public void loginTest(String username, String password) {
System.out.println("Kullanıcı: " + username + " | Şifre: " + password);
}
}

TestNG, DataProvider verilerini paralel olarak da çalıştırabilir.
Bu, özellikle büyük veri setlerinde test süresini ciddi şekilde kısaltır.

@DataProvider(name = "parallelData", parallel = true)
public Object[][] provideParallelData() {
return new Object[][] {
{ "Chrome" },
{ "Firefox" },
{ "Edge" }
};
}
@Test(dataProvider = "parallelData")
public void testBrowser(String browser) {
System.out.println(Thread.currentThread().getId() + " - " + browser);
}

🔹 Her test farklı thread üzerinde çalıştırılır.


  • DataProvider metodunun Object[][] veya Iterator<Object[]> döndürmesi gerekir.
  • DataProvider metodu public olmalıdır.
  • Parametre sayısı, test metodundaki parametrelerle eşleşmelidir.
  • DataProvider metodu static olabilir, ancak zorunlu değildir.

ÖzellikAçıklama
Annotation@DataProvider
Kullanım amacıAynı testi farklı verilerle çalıştırmak
Dönüş tipiObject[][] veya Iterator<Object[]>
Parametreleme@Test(dataProvider = "name")
Paralel Çalışmaparallel = true ile mümkündür

Aşağıdaki örnekte, login testini farklı kullanıcı bilgileriyle çalıştırıyoruz:

public class LoginPageTest {
@DataProvider(name = "loginData")
public Object[][] getLoginData() {
return new Object[][] {
{ "admin@example.com", "admin123", true },
{ "user@example.com", "wrongpass", false }
};
}
@Test(dataProvider = "loginData")
public void testLogin(String email, String password, boolean expectedResult) {
boolean actualResult = login(email, password);
Assert.assertEquals(actualResult, expectedResult);
}
public boolean login(String email, String password) {
return email.equals("admin@example.com") && password.equals("admin123");
}
}

Sonuç:
@DataProvider kullanımı, testlerinizi daha dinamik, tekrar kullanılabilir ve veri odaklı hale getirir.
Özellikle form testleri, login işlemleri, farklı parametre kombinasyonlarının test edilmesi gibi senaryolarda oldukça etkilidir.