testng annotations listeners
In diesem Tutorial werden die verschiedenen Arten von TestNG-Anmerkungen und Listenern erläutert. Außerdem erfahren Sie anhand von Beispielen, wie Sie die TestNG-Anmerkungen und Listener verwenden:
Hier führen wir ein grundlegendes TestNG-Programm mit TestNG-Anmerkungen aus und sehen auch die Rolle von TestNG-Listenern und deren Verwendung beim Testen.
=> Lesen Sie die Easy TestNG-Schulungsreihe durch.
Was du lernen wirst:
Was sind TestNG-Anmerkungen?
Dies sind die Programm- oder Geschäftslogik, die zur Steuerung des Methodenflusses verwendet wird. Sie spielen eine sehr wichtige Rolle in TestNG. Diese Anmerkungen unterscheiden sich in jedem Projekt gemäß den Anforderungen. Der Ablauf der Anmerkungen bleibt trotz der unterschiedlichen Anforderungen in jedem Programm gleich.
Es gibt verschiedene Arten von TestNG-Anmerkungen, die TestNG einfacher und besser als JUnit machen. Jede dieser Anmerkungen wird zu einem bestimmten Ereignis im TestNG ausgeführt.
Arten von Anmerkungen in TestNG
Nachstehend sind die Listen der Anmerkungen und ihrer Attribute aufgeführt, die in TestNG verwendet werden. Lassen Sie uns sie und ihre Verwendung im Detail untersuchen.
Vor
- @BeforeSuite: Diese Methode wird ausgeführt, bevor alle Tests in der Suite ausgeführt werden.
- @BeforeTest: Diese Methode wird ausgeführt, bevor jeder Testabschnitt in der Suite deklariert wird.
- @Vor dem Unterricht: Diese Methode wird vor der ersten Testmethode in der aktuellen Klasse ausgeführt.
- @BeforeMethod: Diese Methode wird vor jeder Testmethode ausgeführt.
- @BeforeGroups: Diese Methode wird ausgeführt, bevor eine Testmethode der angegebenen Gruppe erwähnt wird.
- @Prüfung : Markiert eine Klasse oder eine Methode als Teil des Tests. Oder wir können sagen, dass es eine Methode als Testmethode macht.
Nach dem
- @ AfterSuite: Diese Methode wird ausgeführt, nachdem alle Tests in der Suite ausgeführt wurden.
- @ AfterTest: Diese Methode wird ausgeführt, nachdem jeder Testabschnitt in der Suite deklariert wurde.
- @Nach dem Unterricht: Diese Methode wird nach der letzten Testmethode der Klasse ausgeführt.
- @AfterMethod: Diese Methode wird ausgeführt, nachdem jede Testmethode ausgeführt wurde.
- @ AfterGroups: Diese Methode wird ausgeführt, nachdem die letzte Testmethode der angegebenen Gruppe ausgeführt wurde.
Arbeitsablauf von Anmerkungen
Wenn wir die TestNG.xml-Datei ausführen, werden die TestNG-Annotationen in der folgenden Reihenfolge ausgeführt:
Vor der Suite-> Vor dem Test-> Vor dem Unterricht-> Vor der Methode-> @Test -> Nach der Methode-> Nach dem Unterricht-> Nach dem Test-> Nach der Suite
@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite
@Prüfung hat viele andere Attribute, die uns helfen, unsere Testfälle effektiver auszuführen.
Nachfolgend sind die Attributtypen und ihre Beschreibungen mit Beispielen aufgeführt.
# 1) alwaysRun: Bei true wird diese Methode auch dann ausgeführt, wenn sie von einer fehlgeschlagenen Methode abhängt.
Beispiel: Test (alwaysRun = true)
# 2) dataProvider : Hier wird der Name des Datenanbieters für diese Methode angezeigt. Es hat nur Attribute, d. H. Namen. Wir können es verwenden, wenn wir unsere Software zur Eingabe- oder Laufzeit mit mehreren Datensätzen testen. Dies wird auch als datengesteuertes Testen bezeichnet. Mit diesem Attribut können wir datengesteuerte Tests durchführen.
Beispiel: @dataProvider (name = ”TestData”)
# 3) dataProviderClass : Mit diesem Attribut können Sie die Datenproviderklasse angeben, die den Datenprovider enthält, den die @ Test-Methode verwenden wird.
Beispiel: @Test (dataProvider = 'Client-Datentest', dataProviderClass = ClientDetailsTest.class)
# 4) hängt von Gruppen ab : Dieses Attribut hängt von der Liste der Gruppen ab, d. H. Die Testmethode startet die Ausführung erst, nachdem die abhängigen Gruppen ausgeführt wurden.
Hinweis : Wenn einer der Tests in den Gruppen, von denen abhängig ist, fehlschlägt, wird dieser Test übersprungen.
Unten ist das Beispiel:
@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) hängt von Methoden ab : Diese Anmerkung hängt von der Liste der Methoden ab. Dies bedeutet, dass die Testmethode erst nach Ausführung der abhängigen Methoden mit der Ausführung beginnt.
Hinweis : Wenn einer der Tests in abhängigen Methoden fehlschlägt, wird dieser Test übersprungen.
Beispiel:
@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: Wir können die Attribute einer Testmethode auf true setzen. Dadurch wird die Ausführung des Tests erzwungen, auch wenn einige der Tests in der Gruppe vom Fehlschlagen abhängen.
Zum Beispiel:
@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) Beschreibung : Hier finden Sie die Beschreibung der Methode. Im Allgemeinen enthält es eine einzeilige Zusammenfassung.
Beispiel:
@Test(description = “Regression Test Summary”)
# 8) aktiviert : Dieses Attribut hilft bei der Angabe, ob die bestimmte Testmethode in der aktuellen Suite / Klasse ausgeführt werden soll oder nicht. Manchmal möchten wir einige Tests aus bestimmten Gründen nicht ausführen, z. B. weil sich die Anforderung / Funktion häufig ändert, und wir möchten den aktuellen Lauf für diese bestimmte Funktion nicht stören.
In diesen Fällen können wir diesen bestimmten Test einfach ignorieren / deaktivieren, indem wir diese Funktion als @Test (enabled = false) festlegen.
Beispiel:
@Test(enabled = false) public void imageTest() {//We have disabled this test by giving enabled=false System.out.println(“Image was tested successfully()”); }
# 9) erwartete Ausnahmen : Dieses Attribut zeigt die Liste der Ausnahmen an, die die Testmethode in der Laufzeit auslösen wird. Wenn für die Methode keine Ausnahmen oder andere Ausnahmen ausgelöst werden, wird der Test als Fehler markiert.
Beispiel:
@Test(expectedExceptions = ArithmeticException.class) public void numericTest() { int i = 1 / 0; }
# 10) Gruppen : Mit diesem Attribut werden die Gruppen angegeben, zu denen die Testmethode gehört.
@Test(groups = {“Regression”}) Public void runRegressionTest(){ System.out.println(“test runs were successful”); }
# 11) Priorität : Dies hilft bei der Priorisierung der Testmethoden, während die Standardpriorität mit 0 beginnt und die Tests in aufsteigender Reihenfolge ausgeführt werden.
Beispiel:
@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”); }
Ergebnisse: Nachfolgend sind die Ergebnisse nach Priorität aufgeführt, obwohl dem ersten Test keine Nummer zugewiesen wurde, wurde die Priorität standardmäßig auf 0 gesetzt und die Ausführung in aufsteigender Reihenfolge durchgeführt.
Bestanden: launchApp
Bestanden: loginApp
Bestanden: checkTrans
# 12) Zeitüberschreitung : Dieses Attribut hilft bei der Angabe eines Zeitlimitwerts für den Test (im Allgemeinen als Millisekunden verwendet). Wenn der Test länger als der angegebene Zeitlimitwert dauert, wird der Test als fehlgeschlagen markiert. Wir können dieses Zeitlimit für einen Leistungstest verwenden, um sicherzustellen, dass die Methode innerhalb einer angemessenen Zeit zurückgegeben wird.
@Test(timeOut = 500) public void timeTest() throws InterruptedException { Thread.sleep(400); System.out.println(“Time test method successfully tested”); }
# 13) invocationCount : Dieses Attribut hilft bei der Bestimmung, wie oft eine Testmethode aufgerufen werden soll.
@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();
Ausgabe:
Seitentitel ist Google
Seitentitel ist Google
Seitentitel ist Google
Seitentitel ist Google
Seitentitel ist Google
# 14) invocationTimeOut: Dies ist die maximale Zeit (Anzahl der Millisekunden), die dieser Test für alle Aufrufzählungen dauern sollte. Diese Methode muss zusammen mit der Aufrufzählmethode verwendet werden, da sie sonst ignoriert wird.
Beispiel:
@Test(invocationCount=4, invocationTimeOut=4000) public void loginTest(){ Thread.sleep(1000); System.Out.println(“login Test”); }
Das obige Beispiel zeigt, dass die Ausführung dieses Tests insgesamt 4 Sekunden dauert. Jedes Mal, wenn der Test aufgerufen / ausgeführt wird, dauert die Ausführung 1 Sekunde.
# 15) @DataProvider : Diese Methode hilft bei der Bereitstellung von Daten für eine Testmethode. Zuerst müssen wir eine von @DataProvider annotierte Methode deklarieren und diese Methode dann in der erforderlichen Testmethode unter Verwendung des Attributs „DataProvider“ in der @ Test-Annotation verwenden.
Ein Datenprovider gibt ein Array von Objekten zurück, insbesondere ein zweidimensionales Objektarray () (). Das erste Array repräsentiert einen Datensatz und das zweite Array enthält die Parameter.
@DataProvider (name = 'Test') - Hier steht der Name für den Namen des Datenanbieters. Wenn der Name nicht angegeben wird, wird der Name des DataProviders automatisch auf den Methodennamen festgelegt.
Beispiel:
@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) @Factory : Hiermit wird eine Methode als Factory zum Bereitstellen von Objekten angegeben, die von TestNG für seine Testklassen verwendet werden sollen. Mit @Factory können wir zur Laufzeit dynamische Tests erstellen, die ein Array-Objekt zurückgeben sollten.
Beispiel:
Nehmen wir ein Beispiel, um es besser zu verstehen. Wir werden zwei Klassen erstellen, d. H. FactorySample.Java und FactoryTest.Java
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; } }
Ausgabe : Google wurde erfolgreich gestartet
Google Mail hat sich erfolgreich angemeldet
Unterschied zwischen @ Factory- und @ DataProvider-Anmerkungen
Es gibt einen grundlegenden Unterschied zwischen den beiden Anmerkungen. Es gibt viel Verwirrung in Bezug auf diese beiden Anmerkungen, z. B. wo diese verwendet werden sollen und warum?
Lassen Sie uns die Antworten finden.
@Datenanbieter: Diese Anmerkung parametrisiert die bestimmte Testmethode und führt den Test in einer bestimmten Nr. Aus. von Zeiten basierend auf den von dieser Methode bereitgestellten Daten.
Zum Beispiel, Wenn zwei Parameter vorhanden sind, wird die Testmethode zweimal ausgeführt. Wenn wir uns beispielsweise jedes Mal bei einer Site mit unterschiedlichen Benutzernamen und Kennwörtern anmelden möchten, ist dies hilfreich, da wir die zu testenden Parameter angeben müssen.
@Fabrik : Dadurch werden alle in der Testklassendatei vorhandenen Testmethoden ausgeführt, während eine separate Instanz dieser Klasse verwendet wird. Dies ist nützlich, wenn wir die Testklasse beliebig oft ausführen möchten.
Zum Beispiel Wenn wir die Anmeldefunktion einer Anwendung oder Website testen müssen und diesen Test mehrmals ausführen müssen, ist es besser, @Factory zu verwenden, wo wir mehrere Testinstanzen erstellen und die Tests ausführen können.
Schauen wir uns diese Beispiele an, um den Unterschied zu erkennen.
@ DataProvider Beispiel ::
@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); }
Hinweis : Im obigen Programm haben wir zwei Daten bereitgestellt und das Programmergebnis wäre:
Namen sind: Mihir 145632
Namen sind: Kumar 28242
Dies zeigt, dass die Druckmethode genauso oft ausgeführt wird, wenn wir die Anzahl der Daten in der Nachrichtenmethode erhöhen.
@Factory Beispiel ::
TestNG Factory ist sehr nützlich, wenn mehrere Testklassen mit einer einzigen Testklasse ausgeführt werden müssen.
Sehen wir uns ein Beispiel an.
Dazu müssen wir zwei Testklassen mit wenigen Testmethoden erstellen.
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'); } }
Jetzt müssen wir die @ Factory-Methode definieren, die ein Objektarray der oben definierten Klassen zurückgibt.
Werksprogramm:
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; } }
Ausgabe:
Test1 Testmethode
Test2 Testmethode
PASSED: test1
PASSED: test2
TestNG Listener mit Typen
In einfachen Worten, Listener hören sich das im Selenium-Skript definierte Ereignis an und verhalten sich entsprechend. Der Hauptzweck besteht darin, Protokolle zu erstellen und die TestNG-Berichte anzupassen.
In TestNG sind viele Arten von Listenern verfügbar.
Zum Beispiel , IAnnotationTransformer, IAnnotationTransformer2, IConfigurable, IConfigurationListener, IConfigurationListener2, IExecutionListener, IHookable, IInvokedMethodListener, IInvokedMethodListener2, IMethodInterceptor, IReporter, ISuiteListener, ITest
Beim Testen verwenden wir jedoch nur einige davon, wie unten erläutert:
# 1) ISuiteListener
Dies ist ein Listener für Testsuiten. Es besteht aus zwei Methoden, d.h. am Start() und onFinish () .
Wann immer wir diesen Listener implementieren, wird garantiert, dass der Endbenutzer die Methoden onStart () und onFinish () vor und nach dem Ausführen einer TestNG-Suite aufruft.
Methodendetails:
void onStart (ISuite Suite) : Diese Methode wird aufgerufen, bevor der Suite Runner gestartet wird.
void onFinish (ISuite Suite) : Diese Methode wird aufgerufen, nachdem der Suite Runner alle Testsuiten ausgeführt hat.
Beispiel:
@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
Dieser Listener funktioniert genau wie der ISuiteListener. Der einzige Unterschied besteht jedoch darin, dass der Anruf vor und nach dem Test und nicht in der Suite getätigt wird. Es ist ein Listener für Testläufe und dieser Listener enthält sieben Methoden.
(i) onStart () ::Diese Methode wird aufgerufen, nachdem die Testklasse instanziiert wurde und bevor eine Konfigurationsmethode aufgerufen wird.
Beispiel:
@Override public void onStart(ITestContext context) { System.out.println(“Context Name = ” + context.getName()); }
(ii) onFinish () ::Diese Methode wird aufgerufen, nachdem alle Tests ausgeführt und alle Konfigurationsmethoden aufgerufen wurden.
Beispiel:
public void onFinish(ITestContext context) { System.out.println(context.getPassedTests()); }
(iii) onTestStart () ::Diese Methode wird jedes Mal aufgerufen, bevor ein Test aufgerufen wird. Das ITestResult ist nur teilweise mit den Verweisen auf Klasse, Methode, Start-Millis und Status gefüllt.
Methode: void onTestStart (ITestResult-Ergebnis)
Beispiel:
@Override public void onTestStart(ITestResult result) { System.out.println('Test Started…'+result.getStartMillis()); }
(iv) onTestSuccess () ::Diese Methode wird jedes Mal aufgerufen, wenn ein Test erfolgreich ist.
Methode: void onTestSuccess (ITestResult-Ergebnis)
Beispiel:
@Override public void onTestSuccess(ITestResult result) { System.out.println('Test Success. '+result.getEndMillis()); }
(v) onTestFailure () ::Diese Methode wird jedes Mal aufgerufen, wenn ein Test fehlschlägt.
Methode: void onTestFailure (ITestResult-Ergebnis)
Beispiel:
@Override public void onTestFailure(ITestResult result) { System.out.println('Test Failed. '+result.getTestName()); }
(vi) onTestSkipped () ::Diese Methode wird jedes Mal aufgerufen, wenn ein Test übersprungen wird.
Methode: void onTestSkipped (ITestResult-Ergebnis)
Beispiel:
@Override public void onTestSkipped(ITestResult result) { System.out.println('Test Skipped. '+result.getTestName()); }
(vii) onTestFailedButWithinSuccessPercentage ::Diese Methode wird jedes Mal aufgerufen, wenn eine Methode fehlschlägt, aber mit einem Erfolgsprozentsatz versehen wurde, und der Fehler hält sie innerhalb des Erfolgsprozentsatzes.
Methode: void onTestFailedButWithinSuccessPercentage (ITestResult-Ergebnis)
Beispiel:
@Override public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { System.out.println('Test failed but it is in defined success ratio ' + getTestMethodName(iTestResult)); }
# 3) IExecutionListener
Es ist ein Listener, der den Beginn und das Ende eines TestNG-Laufs überwacht. Es hat zwei Methoden, d.h. onExecutionStart () und onExecutionFinish () .
Die Methode onExecutionStart () wird aufgerufen, bevor TestNG die Suites ausführt, und die Methode onExecutionFinish () wird aufgerufen, nachdem TestNG mit der Ausführung aller Testsuiten abgeschlossen ist.
Methode:
void onExecutionStart ()
void onExecutionFinish ()
Beispiel:
@Override public void onExecutionStart() { System.out.println('TestNG is going to start'); } @Override public void onExecutionFinish() { System.out.println('TestNG is finished'); }
# 4) IInvokedMethodListener
Es ist ein Listener, der vor und nach dem Aufrufen einer Methode durch TestNG aufgerufen wird. Dieser Listener wird nur für Konfigurationen und Testmethoden aufgerufen. Es enthält nur zwei Methoden, d. H. AfterInvocation und beforeInvocation.
- vor der Einberufung: Vor jeder Methode aufrufen.
- afterInvocation: Nach jeder Methode aufrufen.
Methode:
void beforeInvocation (IInvokedMethod-Methode, ITestResult testResult)
void afterInvocation (IInvokedMethod-Methode, ITestResult testResult)
Beispiel:
@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
Diese Klasse wird verwendet, um die Liste der Testmethoden zu ändern, die TestNG ausführen wird. Mit dieser Methode können wir die Liste der Testmethoden neu anordnen.
Dies gilt nur für Methoden, die keine Abhängigen haben, und Methoden, die nicht von anderen Testmethoden abhängen, werden in Parametern übergeben. Diese Schnittstelle gibt eine Liste der Testmethoden zurück, die ausgeführt werden müssen, jedoch auf eine andere sortierte Weise.
Methode:
Was ist der beste Popup-Blocker für Chrom?
java.util.List-Intercept (java.util.List-Methoden, ITestContext-Kontext)
Beispiel:
@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
Dies wird von den Clients implementiert, um einen Bericht zu erstellen. Diese Methode wird aufgerufen, sobald die gesamte Suite ausgeführt wurde und die Parameter alle Testergebnisse angeben, die während dieses Laufs aufgetreten sind.
Methode:
void generateReport (java.util.List xmlSuites, java.util.List suites, java.lang.String outputDirectory)
Beispiel:
@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(); }
Fazit
In diesem Artikel haben wir gesehen, wie TestNG-Anmerkungen hilfreich sein können, um unsere Programmlogik zu vereinfachen. Anmerkungen werden nach Bedarf verwendet.
Sie können die Parameter an die Anmerkungen übergeben und auch datengesteuerte Tests durchführen. Sie können die Testfälle in Gruppen ausführen und Zeit sparen. Mit Listenern können Sie sogar Berichte erstellen. Findest du das nicht wunderbar?
TestNG.xml wird in unserem nächsten Tutorial ausführlich erklärt. Diese XML-Datei ist das Rückgrat des TestNG-Frameworks und hilft uns bei der Ausführung unserer Testfälle.
=> Lesen Sie hier den perfekten TestNG-Schulungsleitfaden.
Literatur-Empfehlungen
- Erfahren Sie, wie Sie TestNG-Anmerkungen in Selen verwenden (mit Beispielen)
- Behauptungen in Selen unter Verwendung von Junit- und TestNG-Frameworks
- Einführung in JUnit Framework und seine Verwendung in Selenium Script - Selenium Tutorial # 11
- 30+ beste Selen-Tutorials: Lernen Sie Selen anhand realer Beispiele
- TestNG-Beispiel: Erstellen und Verwenden der TestNG.xml-Datei
- JMeter Listener: Analysieren von Ergebnissen mit verschiedenen Listenern
- Verwendung des TestNG-Frameworks zum Erstellen von Selenium-Skripten - TestNG Selenium Tutorial # 12
- Eclipse-Tutorial: Integration von TestNG in die Eclipse Java IDE