testng annotations listeners
Bu Eğitimde, Farklı TestNG Ek Açıklamaları ve Dinleyicileri Açıklanmaktadır. Ayrıca TestNG Ek Açıklamalarını ve Dinleyicileri Örneklerle Nasıl Kullanacağınızı Öğreneceksiniz:
Burada, TestNG notlarını kullanarak temel bir TestNG programını çalıştıracağız ve ayrıca TestNG Dinleyicilerinin rolünü ve bunların testte nasıl kullanılacağını göreceğiz.
=> Kolay TestNG Eğitim Serisini Okuyun.
Ne öğreneceksin:
TestNG Ek Açıklamaları Nedir?
Bunlar, yöntemlerin akışını kontrol etmede kullanılan program veya iş mantığıdır. TestNG'de çok önemli bir rol oynuyorlar. Bu açıklamalar her projede gereksinimlere göre farklılık gösterir. Notların akışı, farklı gereksinimlere rağmen her programda aynı kalır.
TestNG'yi JUnit'ten daha kolay ve daha iyi hale getiren farklı TestNG ek açıklaması türleri vardır. Bu Ek Açıklamaların her biri, TestNG'de belirli bir etkinlikte çalışacaktır.
TestNG'de Ek Açıklama Türleri
Aşağıda, TestNG'de kullanılan Ek Açıklamaların listeleri ve öznitelikleri verilmiştir. Onları ve kullanımlarını ayrıntılı olarak inceleyelim.
Önce
- @BeforeSuite: Bu yöntem, paketteki tüm testler çalıştırılmadan önce yürütülecektir.
- @BeforeTest: Bu yöntem, her test bölümü pakette bildirilmeden önce çalıştırılacaktır.
- @Dersten önce: Bu yöntem, mevcut sınıftaki ilk test yönteminden önce çalıştırılacaktır.
- @BeforeMethod: Bu yöntem, her test yönteminden önce yürütülecektir.
- @BeforeGroups: Bu yöntem, belirtilen grubun herhangi bir test yönteminden bahsedilmeden önce yürütülecektir.
- @Ölçek : Bir sınıfı veya yöntemi testin bir parçası olarak işaretler. Ya da test yöntemi olarak bir yöntem yaptığını söyleyebiliriz.
Sonra
- @AfterSuite: Bu yöntem, paketteki tüm testler çalıştırıldıktan sonra yürütülecektir.
- @AfterTest: Bu yöntem, her bir test bölümü pakette bildirildikten sonra yürütülecektir.
- @Dersten sonra: Bu yöntem, sınıfın son test yönteminden sonra çalıştırılacaktır.
- @AfterMethod: Bu yöntem, her test yöntemi uygulandıktan sonra yürütülecektir.
- @AfterGroups: Bu yöntem, belirtilen grubun son test yöntemi yürütüldükten sonra yürütülecektir.
Ek Açıklamaların İş Akışı
TestNG.xml dosyasını çalıştırdığımızda, TestNG ek açıklamaları aşağıdaki sırayla yürütülecektir:
Paketten Önce-> Testten Önce-> Dersten Önce-> Yöntemden Önce-> @Test -> Yöntemden Sonra-> Dersten Sonra-> Testten Sonra-> Suite Sonrası
@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite
@Ölçek test senaryolarımızı daha etkili bir şekilde yürütmemize yardımcı olan birçok başka özelliğe sahiptir.
Aşağıda öznitelik türleri ve örneklerle açıklamaları verilmiştir.
# 1) alwaysRun: True olarak ayarlandığında, bu yöntem başarısız olan bir yönteme bağlı olsa bile çalışır.
Misal: Test (alwaysRun = true)
# 2) dataProvider : Bu, bu yöntem için veri sağlayıcısının adını gösterir. Sadece nitelikleri vardır, yani isim. Yazılımımızı giriş zamanında veya çalışma zamanında birden fazla veri setiyle test ettiğimizde kullanabiliriz. Bu aynı zamanda Veriye dayalı test olarak da bilinir. Bu özelliği kullanarak Veriye dayalı test yapabiliriz.
Misal: @dataProvider (name = ”TestData”)
# 3) dataProviderClass : Bu öznitelik, @Test yönteminin kullanacağı veri sağlayıcısını içerecek veri sağlayıcı sınıfını belirlemenize olanak tanır.
Misal: @Test (dataProvider = 'Müşteri Verileri Testi', dataProviderClass = ClientDetailsTest.class)
# 4) bağlıdırOnGroups : Bu özellik, grup listesine bağlıdır, yani test yöntemi, yalnızca bağımlı gruplar yürütüldükten sonra yürütmeye başlayacaktır.
Not : Bağımlı olan gruplardaki testlerden herhangi biri başarısız olursa o testi atlayacaktır.
Örnek aşağıdadır:
@Test(groups= “homepage”) public void homepageTest(){ System.out.println('Home Page displayed successfully'); } @Test(groups= “transactionspage”) Public void transactionpageTest(){ System.out.println(“Transaction Page displayed successfully”); } @Test(dependsOnGroups={“homepage”, “transactionspage”}) public void dependOnGroupTest1(){ System.out.println(“dependency tested successful”);
# 5) bağlıdırOnMethods : Bu açıklama, yöntemler listesine bağlıdır. Bu, test yönteminin yalnızca bağımlı yöntemler yürütüldükten sonra çalışmaya başlayacağı anlamına gelir.
Not : Bağımlı olan yöntemlerdeki testlerden herhangi biri başarısız olursa, o testi atlayacaktır.
Misal:
@Test public void loginTest() { System.out.println(“Login Tested Successfully”); } @Test public void homepageTest() { System.out.println(“Home Page Tested Successfully”); } @Test(dependsOnMethods={“ loginTest”, “homepageTest”}) public void smokeTest() { System.out.println(“Smoke Tests were done successfully”);
# 6) alwaysRun = true: Bir test yöntemindeki öznitelikleri true olarak ayarlayabiliriz ve bu, gruptaki bazı testlerin başarısız olmasına bağlı olsa bile testi yürütülmeye zorlar.
Örneğin:
@Test public void launchAppTest() { System.out.println(“Application launched Successfully”); } @Test public void loginAppTest() { System.out.println(“Application logged in Successfully”); } @Test(dependsOnMethods={“launchAppTest”, “loginAppTest”}, alwaysRun=true) public void smokeTest() { System.out.println(“Smoke Test were done successfully”); }
# 7) açıklama : Bu, yöntemin açıklamasını sağlar. Genellikle tek satırlık bir özet içerir.
Misal:
@Test(description = “Regression Test Summary”)
# 8) etkinleştirildi : Bu öznitelik, geçerli paket / sınıfta belirli test yöntemini çalıştırmak / yürütmek isteyip istemediğimizi belirlemede yardımcı olur. Bazen, gereksinim / işlevin sık sık değişmesi gibi bazı nedenlerden dolayı birkaç test yapmak istemiyoruz ve o belirli işlev için mevcut çalışmayı bozmak istemiyoruz.
Bu durumlarda, bu özelliği @Test (enabled = false) olarak ayarlayarak söz konusu testi basitçe yok sayabilir / devre dışı bırakabiliriz.
Misal:
@Test(enabled = false) public void imageTest() {//We have disabled this test by giving enabled=false System.out.println(“Image was tested successfully()”); }
9) Beklenen İstisnalar : Bu öznitelik, test yönteminin çalışma zamanında ortaya koyacağı istisnaların listesini gösterir. Yöntem için herhangi bir istisna veya başka bir istisna atılmazsa, test başarısız olarak işaretlenir.
Misal:
@Test(expectedExceptions = ArithmeticException.class) public void numericTest() { int i = 1 / 0; }
# 10) gruplar : Bu özellik, test yönteminin ait olduğu grupları belirtmek için kullanılır.
@Test(groups = {“Regression”}) Public void runRegressionTest(){ System.out.println(“test runs were successful”); }
# 11) öncelik : Bu, test yöntemlerinin önceliklendirilmesine yardımcı olurken, varsayılan öncelik 0 ile başlar ve testler artan sırada yürütülür.
Misal:
@Test Public void launchApp(){ System.out.println(“Application was launched successfully”): } @Test (priority = 1) Public void loginApp(){ System.out.println(“Application logged in successfully”); } @Test (priority = 2) Public void checkTrans(){s System.out.println(“Checked Transactions successfully”); }
Sonuçlar: Aşağıda, önceliklere göre sonuçlar verilmiştir, ilk teste numara atanmamış olmasına rağmen, varsayılan olarak önceliğini 0 olarak almış ve çalıştırma artan sırada yapılmıştır.
Geçti: launchApp
Geçti: loginApp
Geçti: checkTrans
# 12) zaman aşımı : Bu özellik, test için bir zaman aşımı değeri belirlemede yardımcı olur (genellikle milisaniye olarak kullanılır). Test, belirtilen zaman aşımı değerinden daha uzun sürerse, test başarısız olarak işaretlenir. Yöntemin makul bir süre içinde geri döndüğünden emin olmak için bu zaman aşımını performans testi yapmak için kullanabiliriz.
@Test(timeOut = 500) public void timeTest() throws InterruptedException { Thread.sleep(400); System.out.println(“Time test method successfully tested”); }
# 13) invocationCount : Bu özellik, bir test yönteminin kaç kez çağrılması gerektiğini belirlemeye yardımcı olur.
@Test(invocationCount = 5) public void loginTest() { WebDriver driver = new FirefoxDriver(); driver.get('http://www.google.com'); System.out.println('Page Title is ' + driver.getTitle()); driver.quit();
Çıktı:
Sayfa Başlığı Google
Sayfa Başlığı Google
Sayfa Başlığı Google
Sayfa Başlığı Google
Sayfa Başlığı Google
# 14) invocationTimeOut: Bu, bu testin tüm çağrı sayıları için alması gereken maksimum süredir (milisaniye sayısı). Bu yöntem, çağrı sayma yöntemiyle birlikte kullanılmalıdır, aksi takdirde yok sayılır.
Misal:
@Test(invocationCount=4, invocationTimeOut=4000) public void loginTest(){ Thread.sleep(1000); System.Out.println(“login Test”); }
Yukarıdaki örnek, bu testin yürütülmesinin toplam 4 saniye süreceğini ve test her çalıştırıldığında / çalıştırıldığında, yürütülmesinin 1 saniye süreceğini göstermektedir.
# 15) @DataProvider : Bu yöntem, bir test yöntemi için veri sağlamaya yardımcı olur. Öncelikle @DataProvider ile açıklamalı bir yöntem bildirmeli ve ardından bu yöntemi @Test açıklamasında 'DataProvider' özelliğini kullanarak gerekli test yönteminde kullanmalıyız.
Bir Veri sağlayıcı, özellikle iki boyutlu bir nesne dizisi () () bir nesne dizisi döndürür. İlk dizi bir veri kümesini temsil eder ve ikinci dizi parametreleri içerir.
@DataProvider (name = “Test”) - Burada ad, Veri Sağlayıcının adını temsil eder. Ad verilmemişse, DataProvider'ın adı otomatik olarak yöntem adına ayarlanacaktır.
Misal:
@DataProvider(name = “Name”) public object()() credentials(){ return new object ()() { { “Mohan”, “23”}, { “Shikhar”, “30”} }; } //Now we are calling the Data Provider object by its name @Test(DataProvider = “Name”) Public void testData(String sName, int age) { System.out.println(“Data is: (Name, age)”); }
# 16) @ Fabrika : Bu, test sınıfları için TestNG tarafından kullanılacak nesneleri sağlamak için fabrika olarak bir yöntem belirtmek için kullanılır. @Factory kullanarak çalışma anında dinamik testler oluşturabiliriz ve bunun bir dizi nesnesi döndürmesi gerekir.
Misal:
Daha iyi anlamak için bir örnek verelim. FactorySample.Java ve FactoryTest.Java gibi iki sınıf oluşturacağız.
FactorySample.Java
public class FactorySample { @Test public void googleTest() { System.out.println(“Google was launched successfully”); } @Test public void gmailLogin() { System.out.println(“Gmail logged in successfully”); }
FactoryTest.Java
public class FactoryTest { @Factory() public Object() testFact() { FactorySample fs = new FactorySample(2); fs(0) = new googleTest(); fs(1) = new gmailLogin(); return fs; } }
Çıktı : Google başarıyla başlatıldı
Gmail başarıyla giriş yaptı
@Factory ve @DataProvider Ek Açıklamaları Arasındaki Fark
Her iki ek açıklama arasında temel bir fark vardır. Bu iki ek açıklamayla ilgili olarak bunların nerede ve neden kullanılacağı gibi pek çok kafa karışıklığı var.
Cevapları bulalım.
@DataProvider: Bu açıklama, belirli test yöntemini parametrelendirecek ve testi belirli bir no. Bu yöntemle sağlanan verilere göre zaman sayısı.
Örneğin, iki parametre varsa, test yöntemi iki kez yürütülecektir. Örneğin, her seferinde farklı kullanıcı adı ve parola kümelerine sahip bir siteye giriş yapmak istiyorsak, test edilecek parametreleri sağlamamız gerektiğinden bu yararlıdır.
@Fabrika : Bu, o sınıfın ayrı bir örneğini kullanırken test sınıfı dosyasında bulunan tüm test yöntemlerini çalıştırır. Bu, test sınıfını herhangi bir sayıda çalıştırmak istiyorsak kullanışlıdır.
Örneğin , herhangi bir uygulamanın veya web sitesinin oturum açma işlevini test etmemiz gerekiyorsa ve bu testi birden çok kez çalıştırmamız gerektiğinden, birden fazla test örneği oluşturup testleri çalıştırabileceğimiz @Factory'yi kullanmak daha iyidir.
Farkı anlamak için bu örneklere bir göz atalım.
@DataProvider Örneği :
@DataProvider public Object()() message(){ return new Object ()(){{“Mihir” , new Integer (145632)}, {“Kumar”, new Integer (28242)}}; } @Test (dataProvider=”message”) public void PrintMsg(String name, Integer id){ System.out.println(“Names are: “+name+” “+id); }
Not : Yukarıdaki programda iki veri sağladık ve program sonucu şöyle olacaktır:
İsimler: Mihir 145632
İsimler: Kumar 28242
Bu, mesaj yöntemindeki veri sayısını arttırırsak, yazdırma yönteminin aynı sayıda çalıştıracağını gösterir.
@Factory Örneği :
TestNG Factory, tek bir test sınıfı kullanarak birden fazla test sınıfı çalıştırmamız gerektiğinde çok kullanışlıdır.
Bir örnek görelim.
Bunun için, içinde birkaç test yöntemi olan iki test sınıfı oluşturmamız gerekiyor.
TestData 1:
public class TestData1 { @Test public void testData1() { System.out.println('Test data 1 successfully tested'); } }
TestData 2:
public class TestData2 { @Test public void testData2() { System.out.println('Test data 2 successfully tested'); } }
Şimdi, yukarıda tanımlanan sınıfların bir nesne dizisini döndüren @Factory yöntemini tanımlamalıyız.
Fabrika Programı:
public class TestNGFactory { @Factory() public Object() getTestClass() { Object() tests = new Object(2); tests(0) = new Test Data 1(); tests(1) = new Test Data 2(); return tests; } }
Çıktı:
Test1 test yöntemi
Test2 test yöntemi
GEÇTİ: test1
GEÇTİ: test2
Türlerle TestNG Dinleyicileri
Basit bir ifadeyle, Dinleyiciler Selenium senaryosunda tanımlanan olayı dinler ve ona göre davranır. Temel amaç, günlükler oluşturmak ve TestNG raporlarını özelleştirmektir.
TestNG'de pek çok dinleyici türü vardır.
Örneğin , IAnnotationTransformer, IAnnotationTransformer2, IConfigurable, IConfigurationListener, IConfigurationListener2, IExecutionListener, IHookable, IInvokedMethodListener, IInvokedMethodListener2, IMethodInterceptor, IReporter, ISuiteListener, ISuite
Bununla birlikte, test söz konusu olduğunda, aşağıda tartışıldığı gibi yalnızca birkaçını kullanıyoruz:
# 1) ISuiteListener
Bu, test paketleri için bir dinleyicidir. İki yöntemden oluşur, yani onStart () ve onFinish () .
Bu dinleyiciyi her uyguladığımızda, son kullanıcının bir TestNG paketini çalıştırmadan önce ve sonra onStart () ve onFinish () yöntemlerini çağıracağını garanti edecektir.
Yöntem ayrıntıları:
void onStart (ISuite paketi) : Bu yöntem Suite Runner başlamadan önce çağrılır.
void onFinish (ISuite paketi) : Bu yöntem, Suite Runner tüm test takımlarını çalıştırdıktan sonra başlatılır.
Misal:
@Override public void onStart(ISuite suite) { System.out.println(“TestNG Suite Starts”); } @Override public void onFinish(ISuite suite) { System.out.println(“TestNG Suite Finishes”); }
# 2) ITestListener
Bu dinleyici, ISuiteListener gibi çalışır. Ancak, aradaki tek fark, çağrıyı Testten önce ve sonra yapması ve Suite'ten değil. Test çalıştırması için bir dinleyicidir ve bu dinleyicinin içinde yedi yöntemi vardır.
(i) onStart () :Bu yöntem, test sınıfı başlatıldıktan sonra ve herhangi bir yapılandırma yöntemi çağrılmadan önce çağrılır.
Misal:
@Override public void onStart(ITestContext context) { System.out.println(“Context Name = ” + context.getName()); }
(ii) onFinish () :Bu yöntem, tüm testler çalıştıktan ve tüm yapılandırma yöntemleri çağrıldıktan sonra çağrılır.
Misal:
public void onFinish(ITestContext context) { System.out.println(context.getPassedTests()); }
(iii) onTestStart () :Bu yöntem, bir test başlatılmadan önce her seferinde çağrılır. ITestResult, sınıf, yöntem, başlangıç mili ve durum referanslarıyla yalnızca kısmen doldurulur.
Yöntem: void onTestStart (ITestResult sonucu)
Misal:
@Override public void onTestStart(ITestResult result) { System.out.println('Test Started…'+result.getStartMillis()); }
(iv) onTestSuccess () :Bu yöntem, bir test başarılı olduğunda her seferinde çağrılır.
Yöntem: void onTestSuccess (ITestResult sonucu)
Misal:
@Override public void onTestSuccess(ITestResult result) { System.out.println('Test Success. '+result.getEndMillis()); }
(v) onTestFailure () :Bu yöntem, bir test başarısız olduğunda her seferinde çağrılır.
Yöntem: void onTestFailure (ITestResult sonucu)
Misal:
@Override public void onTestFailure(ITestResult result) { System.out.println('Test Failed. '+result.getTestName()); }
(vi) onTestSkipped () :Bu yöntem, bir test her atlandığında çağrılır.
Yöntem: void onTestSkipped (ITestResult sonucu)
Misal:
@Override public void onTestSkipped(ITestResult result) { System.out.println('Test Skipped. '+result.getTestName()); }
(vii) onTestFailedButWithinSuccessPercentage :Bu yöntem, bir yöntem başarısız olduğunda her seferinde çağrılır, ancak başarı yüzdesi ile açıklanır ve başarısızlık onu başarı yüzdesi içinde tutar.
Yöntem: void onTestFailedButWithinSuccessPercentage (ITestResult sonucu)
Misal:
@Override public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { System.out.println('Test failed but it is in defined success ratio ' + getTestMethodName(iTestResult)); }
# 3) IExecutionListener
Bir TestNG çalışmasının başlangıcını ve sonunu izleyen bir dinleyicidir. İki yöntemi vardır, yani onExecutionStart () ve onExecutionFinish () .
TestNG, paketleri çalıştırmaya başlamadan önce onExecutionStart () yöntemi çağrılır ve tüm test paketlerinin çalıştırılmasıyla TestNG tamamlandıktan sonra onExecutionFinish () yöntemi çağrılır.
Yöntem:
void onExecutionStart ()
void onExecutionFinish ()
Misal:
@Override public void onExecutionStart() { System.out.println('TestNG is going to start'); } @Override public void onExecutionFinish() { System.out.println('TestNG is finished'); }
# 4) IInvokedMethodListener
Bir yöntemin TestNG tarafından çağrılmasından önce ve sonra çağrılan bir dinleyicidir. Bu dinleyici yalnızca konfigürasyonlar ve test yöntemleri için çağrılır. İçinde yalnızca iki yöntemi vardır, yani Invocation'dan sonra veInvocation'dan önce.
- davet etmeden önce: Her yöntemden önce çağırın.
- afterInvocation: Her yöntemden sonra çağırın.
Yöntem:
void beforeInvocation (IInvokedMethod yöntemi, ITestResult testResult)
void afterInvocation (IInvokedMethod yöntemi, ITestResult testResult)
Misal:
@Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println('before invocation of ' + method.getTestMethod().getMethodName()); } @Override public void afterInvocation(IInvokedMethod method, ITestResult testResult) { System.out.println('after invocation of ' + method.getTestMethod().getMethodName()); }
# 5) IMethodInterceptor
Bu sınıf, TestNG'nin çalıştıracağı test yöntemlerinin listesini değiştirmek için kullanılır. Bu yöntemi kullanarak, test yöntemleri listesini yeniden sıralayabiliriz.
Yalnızca bağımlısı olmayan yöntemler için geçerlidir ve başka herhangi bir test yöntemine bağlı olmayan yöntemler parametrelere aktarılır. Bu arayüz, çalıştırılması gereken, ancak farklı bir şekilde sıralanmış test yöntemlerinin bir listesini döndürecektir.
Yöntem:
wifi için ağ güvenlik anahtarı nerede bulunur
java.util.List intercept (java.util.List yöntemleri, ITestContext bağlamı)
Misal:
@Override public Listintercept(Listmethods, ITestContext context) { List result = new ArrayList(); for (IMethodInstance m : methods) { Test test = m.getMethod().getMethod().getAnnotation(Test.class); Setgroups = new HashSet(); for (String group : test.groups()) { groups.add(group); } if (groups.contains('sanity')) { result.add(m); } else { String testMethod = m.getMethod().getMethodName(); System.out.println(testMethod + ' not a SANITY test so not included'); } } return result; }
# 6) IReporter
Bu, müşteriler tarafından bir rapor oluşturmak için uygulanır. Bu yöntem, tüm paket çalıştıktan ve parametreler o çalıştırma sırasında gerçekleşen tüm test sonuçlarını verdiğinde çağrılacaktır.
Yöntem:
void generateReport (java.util.List xmlSuites, java.util.List suites, java.lang.String outputDirectory)
Misal:
@Override public void generateReport(List xmlSuites, List suites, String outdir) { try { writer = createWriter(outdir); } catch (IOException e) { System.err.println('Unable to create output file'); e.printStackTrace(); return; } startHtml(writer); writeReportTitle(reportTitle); generateSuiteSummaryReport(suites); generateMethodSummaryReport(suites); generateMethodDetailReport(suites); endHtml(writer); writer.flush(); writer.close(); }
Sonuç
Bu makalede, TestNG Ek Açıklamalarının Program mantığımızı kolaylaştırmada nasıl yararlı olabileceğini gördük. Ek açıklamalar gerektiği gibi kullanılır.
Parametreleri ek açıklamalara aktarabilir ve Veriye Dayalı Test de yapabilirsiniz. Test senaryolarını gruplar halinde çalıştırabilir ve zamandan tasarruf edebilirsiniz. Dinleyicilerle raporları bile oluşturabilirsiniz. Bunun harika olduğunu düşünmüyor musun?
TestNG.xml, yaklaşan eğitimimizde ayrıntılı olarak açıklanacaktır. Bu XML dosyası, TestNG çerçevesinin bel kemiğidir ve test durumlarımızı yürütmemize yardımcı olacaktır.
=> Mükemmel TestNG Eğitim Kılavuzuna Buradan Bakabilirsiniz.
Önerilen Kaynaklar
- Selenyumda TestNG Ek Açıklamalarının Nasıl Kullanılacağını Öğrenin (Örneklerle)
- Junit ve TestNG Çerçevelerini Kullanan Selenium'daki İddialar
- JUnit Framework'e Giriş ve Selenium Script'te Kullanımı - Selenium Tutorial # 11
- 30+ En İyi Selenyum Öğreticisi: Gerçek Örneklerle Selenyum Öğrenin
- TestNG Örneği: TestNG.xml Dosyası Nasıl Oluşturulur ve Kullanılır
- JMeter Dinleyicileri: Sonuçları Farklı Dinleyicilerle Analiz Etme
- Selenium Komut Dosyaları Oluşturmak için TestNG Framework Nasıl Kullanılır - TestNG Selenium Tutorial # 12
- Eclipse Eğitimi: Eclipse Java IDE'ye TestNG'yi Entegre Etme