testng annotations listeners
W tym samouczku wyjaśniono różne typy adnotacji i detektorów TestNG. Dowiesz się również, jak korzystać z adnotacji i słuchaczy TestNG z przykładami:
Tutaj uruchomimy podstawowy program TestNG przy użyciu adnotacji TestNG, a także zobaczymy rolę słuchaczy TestNG i jak ich używać w testowaniu.
=> Przeczytaj serię szkoleń Easy TestNG.
Czego się nauczysz:
Co to są adnotacje TestNG?
Są to programy lub logika biznesowa, które są używane do kontrolowania przepływu metod. Odgrywają bardzo ważną rolę w TestNG. Te adnotacje różnią się w każdym projekcie, zgodnie z wymaganiami. Przepływ adnotacji pozostaje taki sam w każdym programie pomimo różnych wymagań.
Istnieją różne typy adnotacji TestNG, które sprawiają, że TestNG jest łatwiejsze i lepsze niż JUnit. Każda z tych adnotacji zostanie uruchomiona podczas określonego wydarzenia w TestNG.
Rodzaje adnotacji w TestNG
Poniżej podano listy adnotacji i ich atrybutów, które są używane w TestNG. Przeanalizujmy szczegółowo je i ich zastosowania.
Przed
- @BeforeSuite: Ta metoda zostanie wykonana przed uruchomieniem wszystkich testów w zestawie.
- @BeforeTest: Ta metoda zostanie wykonana przed zadeklarowaniem każdej sekcji testowej w zestawie.
- @Przed zajęciami: Ta metoda zostanie wykonana przed pierwszą metodą testową w bieżącej klasie.
- @BeforeMethod: Ta metoda zostanie wykonana przed każdą metodą testową.
- @BeforeGroups: Ta metoda zostanie wykonana, zanim zostanie wspomniana jakakolwiek metoda testowa z określonej grupy.
- @Test : Oznacza klasę lub metodę jako część testu. Albo możemy powiedzieć, że tworzy metodę jako metodę testową.
Po
- @AfterSuite: Ta metoda zostanie wykonana po wykonaniu wszystkich testów w pakiecie.
- @AfterTest: Ta metoda zostanie wykonana po zadeklarowaniu każdej sekcji testowej w zestawie.
- @Po zajęciach: Ta metoda zostanie wykonana po ostatniej metodzie testowej klasy.
- @AfterMethod: Ta metoda zostanie wykonana po wykonaniu każdej metody testowej.
- @AfterGroups: Ta metoda zostanie wykonana po wykonaniu ostatniej metody testowej z określonej grupy.
Przepływ pracy z adnotacjami
Kiedy uruchamiamy plik TestNG.xml, adnotacje TestNG zostaną wykonane w następującej kolejności:
Przed zajęciami -> Przed testem -> Przed zajęciami -> Przed metodą -> @Test -> Po metodzie -> Po zajęciach -> Po teście -> Po ćwiczeniach
@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite
@Test ma wiele innych atrybutów, które pomagają nam w skuteczniejszym wykonywaniu przypadków testowych.
Poniżej znajdują się typy atrybutów i ich opisy wraz z przykładami.
# 1) alwaysRun: W przypadku ustawienia wartości true ta metoda będzie działać, nawet jeśli zależy od metody, która się nie powiodła.
Przykład: Test (alwaysRun = true)
# 2) dataProvider : Pokazuje nazwę dostawcy danych dla tej metody. Posiada tylko atrybuty tj. Imię. Możemy go używać, gdy testujemy nasze oprogramowanie z wieloma zestawami danych w czasie wprowadzania lub w czasie wykonywania. Nazywa się to również testowaniem opartym na danych. Za pomocą tego atrybutu możemy przeprowadzać testy oparte na danych.
Przykład: @dataProvider (name = ”TestData”)
# 3) dataProviderClass : Ten atrybut umożliwia określenie klasy dostawcy danych, która będzie zawierała dostawcę danych, którego będzie używać metoda @Test.
Przykład: @Test (dataProvider = 'Test danych klienta', dataProviderClass = ClientDetailsTest.class)
# 4) dependsOnGroups : Ten atrybut zależy od listy grup, tzn. Metoda testowa rozpocznie wykonywanie dopiero po wykonaniu grup zależnych.
Uwaga : Jeśli którykolwiek z testów w grupach, od których są zależne, zakończy się niepowodzeniem, pominie ten test.
Poniżej znajduje się przykład:
@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) dependsOnMethods : Ta adnotacja zależy od listy metod. Oznacza to, że metoda testowa rozpocznie wykonywanie dopiero po wykonaniu metod zależnych.
Uwaga : Jeśli którykolwiek z testów w metodach zależnych zakończy się niepowodzeniem, pominie on ten test.
Przykład:
@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: Możemy ustawić atrybuty metody testowej na true, co wymusi wykonanie testu, nawet jeśli niektóre testy w grupie zależą od niepowodzenia.
Na przykład:
@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) opis : Zawiera opis metody. Ogólnie zawiera jednowierszowe podsumowanie.
Przykład:
@Test(description = “Regression Test Summary”)
# 8) włączone : Ten atrybut pomaga w określeniu, czy chcemy uruchomić / wykonać określoną metodę testową w bieżącym zestawie / klasie, czy nie. Czasami nie chcemy przeprowadzać kilku testów z pewnych powodów, takich jak często zmieniające się wymaganie / funkcja, a nie chcemy zakłócać bieżącego uruchomienia tej konkretnej funkcji.
W takich przypadkach możemy po prostu zignorować / wyłączyć ten konkretny test, ustawiając tę funkcję jako @Test (enabled = false).
Przykład:
@Test(enabled = false) public void imageTest() {//We have disabled this test by giving enabled=false System.out.println(“Image was tested successfully()”); }
# 9) Oczekiwano wyjątków : Ten atrybut pokazuje listę wyjątków, które metoda testowa będzie generować w czasie wykonywania. Jeśli dla metody nie zostanie zgłoszony żaden wyjątek ani żaden inny wyjątek, test zostanie oznaczony jako niepowodzenie.
Przykład:
@Test(expectedExceptions = ArithmeticException.class) public void numericTest() { int i = 1 / 0; }
# 10) grupy : Ten atrybut służy do określenia grup, do których należy metoda badawcza.
@Test(groups = {“Regression”}) Public void runRegressionTest(){ System.out.println(“test runs were successful”); }
# 11) priorytet : Pomaga to w ustalaniu priorytetów metod testowych, podczas gdy domyślny priorytet zaczyna się od 0, a testy są wykonywane w kolejności rosnącej.
Przykład:
@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”); }
Wyniki: Poniżej znajdują się wyniki według priorytetu, mimo że do pierwszego testu nie przypisano żadnego numeru, domyślnie przyjął on priorytet na 0, a wykonanie zostało wykonane w kolejności rosnącej.
Zaliczono: launchApp
Zaliczono: loginApp
Zdany: checkTrans
# 12) limit czasu : Ten atrybut pomaga w określeniu wartości limitu czasu dla testu (zwykle używany jako milisekundy). Jeśli test trwa dłużej niż określona wartość limitu czasu, test jest oznaczany jako niepowodzenie. Możemy wykorzystać ten limit czasu do wykonania testu wydajności, aby upewnić się, że metoda powróci w rozsądnym czasie.
@Test(timeOut = 500) public void timeTest() throws InterruptedException { Thread.sleep(400); System.out.println(“Time test method successfully tested”); }
# 13) invocationCount : Ten atrybut pomaga w określeniu, ile razy należy wywołać metodę testową.
@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();
Wynik:
Tytuł strony to Google
Tytuł strony to Google
Tytuł strony to Google
Tytuł strony to Google
Tytuł strony to Google
# 14) invocationTimeOut: Jest to maksymalny czas (liczba milisekund), jaki ten test powinien zająć dla wszystkich zliczeń wywołań. Ta metoda musi być używana wraz z metodą liczenia wywołań, w przeciwnym razie zostanie zignorowana.
Przykład:
@Test(invocationCount=4, invocationTimeOut=4000) public void loginTest(){ Thread.sleep(1000); System.Out.println(“login Test”); }
Powyższy przykład pokazuje, że wykonanie tego testu zajmie łącznie 4 sekundy, a za każdym razem, gdy test jest wywoływany / uruchamiany, jego wykonanie zajmie 1 sekundę.
# 15) @DataProvider : Ta metoda pomaga w dostarczaniu danych do metody badawczej. Najpierw musimy zadeklarować metodę z adnotacją @DataProvider, a następnie użyć tej metody w wymaganej metodzie testowej, używając atrybutu „DataProvider” w adnotacji @Test.
Dostawca danych zwraca tablicę obiektów, zwłaszcza dwuwymiarową tablicę obiektów () (). Pierwsza tablica reprezentuje zestaw danych, a druga tablica zawiera parametry.
@DataProvider (name = „Test”) - w tym przypadku nazwa reprezentuje nazwę dostawcy danych. Jeśli nazwa nie zostanie podana, nazwa dostawcy danych zostanie automatycznie ustawiona na nazwę metody.
Przykład:
@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 : Służy do określenia metody jako fabryki zapewniającej obiekty, które mają być używane przez TestNG dla jego klas testowych. Używając @Factory, możemy tworzyć testy dynamiczne w czasie wykonywania i powinny one zwracać obiekt tablicy.
Przykład:
Weźmy przykład, aby lepiej to zrozumieć. Stworzymy dwie klasy, czyli FactorySample.Java i 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; } }
Wynik : Google został pomyślnie uruchomiony
Gmail zalogował się pomyślnie
Różnica między adnotacjami @Factory i @DataProvider
Istnieje podstawowa różnica między obiema adnotacjami. Istnieje wiele nieporozumień związanych z tymi dwoma adnotacjami, np. Gdzie ich używać i dlaczego?
Poszukajmy odpowiedzi.
@Dostawca danych: Ta adnotacja sparametryzuje konkretną metodę testową i wykona test w określonym nr. razy na podstawie danych dostarczonych tą metodą.
Na przykład, jeśli są dwa parametry, metoda testowa zostanie wykonana dwukrotnie. Na przykład, jeśli chcemy za każdym razem logować się do witryny z różnymi zestawami nazw użytkowników i haseł, jest to przydatne, ponieważ musimy podać parametry do przetestowania.
@Fabryka : Spowoduje to wykonanie wszystkich metod testowych obecnych w pliku klasy testowej podczas korzystania z oddzielnej instancji tej klasy. Jest to przydatne, jeśli chcemy uruchomić klasę testową dowolną liczbę razy.
Na przykład , jeśli musimy przetestować funkcję logowania w dowolnej aplikacji lub witrynie i ponieważ musimy uruchamiać ten test wiele razy, lepiej jest użyć @Factory, gdzie możemy utworzyć wiele instancji testów i uruchomić testy.
Rzućmy okiem na te przykłady, aby poznać różnicę.
@DataProvider Example :
@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); }
Uwaga : W powyższym programie podaliśmy dwie dane, a wynik programu będzie:
Nazwiska to: Mihir 145632
Nazwiska to: Kumar 28242
To pokazuje, że jeśli zwiększymy liczbę danych w metodzie wiadomości, to metoda print wykona taką samą liczbę razy.
@Factory Example :
TestNG Factory jest bardzo przydatne, gdy musimy uruchomić wiele klas testowych przy użyciu jednej klasy testowej.
Zobaczmy przykład.
W tym celu musimy utworzyć dwie klasy testowe zawierające kilka metod testowych.
Dane testowe 1:
public class TestData1 { @Test public void testData1() { System.out.println('Test data 1 successfully tested'); } }
Dane testowe 2:
public class TestData2 { @Test public void testData2() { System.out.println('Test data 2 successfully tested'); } }
Teraz musimy zdefiniować metodę @Factory, która zwraca tablicę obiektów wyżej zdefiniowanych klas.
Program fabryczny:
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; } }
Wynik:
Metoda testowa Test1
Metoda testowa Test2
PASSED: test1
PASSED: test2
Słuchacze TestNG z typami
Mówiąc prościej, Słuchacze słuchają zdarzenia zdefiniowanego w skrypcie Selenium i zachowują się zgodnie z nim. Głównym celem jest tworzenie dzienników i dostosowywanie raportów TestNG.
W TestNG dostępnych jest wiele typów słuchaczy.
Na przykład , IAnnotationTransformer, IAnnotationTransformer2, IConfigurable, IConfigurationListener, IConfigurationListener2, IExecutionListener, IHookable, IInvokedMethodListener, IInvokedMethodListener2, IMethodInterceptor, IReporter, ISuiteListener
Jednak jeśli chodzi o testowanie, używamy tylko kilku z nich, jak omówiono poniżej:
# 1) ISuiteListener
To jest odbiornik pakietów testowych. Składa się z dwóch metod tj. onStart () i onFinish () .
Za każdym razem, gdy zaimplementujemy ten detektor, zagwarantuje to, że użytkownik końcowy wywoła metody onStart () i onFinish () przed i po uruchomieniu zestawu TestNG.
Szczegóły metody:
void onStart (pakiet ISuite) : Ta metoda jest wywoływana przed uruchomieniem Suite Runner.
void onFinish (pakiet ISuite) : Ta metoda jest wywoływana po uruchomieniu wszystkich pakietów testowych przez Suite Runner.
Przykład:
@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
Ten detektor działa tak samo jak ISuiteListener. Jednak jedyną różnicą jest to, że wywołuje połączenie przed i po teście, a nie pakiet. Jest to detektor do uruchamiania testów, który ma siedem metod.
(i) onStart () :Ta metoda jest wywoływana po utworzeniu wystąpienia klasy testowej i przed wywołaniem jakiejkolwiek metody konfiguracyjnej.
Przykład:
@Override public void onStart(ITestContext context) { System.out.println(“Context Name = ” + context.getName()); }
(ii) onFinish () :Ta metoda jest wywoływana po wykonaniu wszystkich testów i wywołaniu wszystkich metod konfiguracyjnych.
Przykład:
public void onFinish(ITestContext context) { System.out.println(context.getPassedTests()); }
(iii) onTestStart () :Ta metoda jest wywoływana za każdym razem przed wywołaniem testu. ITestResult jest tylko częściowo wypełniony odwołaniami do klasy, metody, milisekund startu i statusu.
Metoda: void onTestStart (wynik ITestResult)
Przykład:
@Override public void onTestStart(ITestResult result) { System.out.println('Test Started…'+result.getStartMillis()); }
(iv) onTestSuccess () :Ta metoda jest wywoływana za każdym razem, gdy test się powiedzie.
Metoda: void onTestSuccess (wynik ITestResult)
Przykład:
@Override public void onTestSuccess(ITestResult result) { System.out.println('Test Success. '+result.getEndMillis()); }
(v) onTestFailure () :Ta metoda jest wywoływana za każdym razem, gdy test zakończy się niepowodzeniem.
Metoda: void onTestFailure (wynik ITestResult)
Przykład:
@Override public void onTestFailure(ITestResult result) { System.out.println('Test Failed. '+result.getTestName()); }
(vi) onTestSkipped () :Ta metoda jest wywoływana za każdym razem, gdy test jest pomijany.
Metoda: void onTestSkipped (wynik ITestResult)
Przykład:
@Override public void onTestSkipped(ITestResult result) { System.out.println('Test Skipped. '+result.getTestName()); }
(vii) onTestFailedButWithinSuccessPercentage :Ta metoda jest wywoływana za każdym razem, gdy metoda kończy się niepowodzeniem, ale została opatrzona adnotacją procentową wartość sukcesu, a niepowodzenie utrzymuje ją w przedziale procentowym sukcesu.
Metoda: void onTestFailedButWithinSuccessPercentage (wynik ITestResult)
Przykład:
@Override public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { System.out.println('Test failed but it is in defined success ratio ' + getTestMethodName(iTestResult)); }
# 3) IExecutionListener
Jest to słuchacz, który monitoruje początek i koniec przebiegu TestNG. Ma dwie metody, tj. onExecutionStart () i onExecutionFinish () .
Metoda onExecutionStart () jest wywoływana, zanim TestNG zacznie uruchamiać zestawy, a metoda onExecutionFinish () jest wywoływana po zakończeniu TestNG z uruchomieniem wszystkich zestawów testów.
Metoda:
void onExecutionStart ()
void onExecutionFinish ()
Przykład:
@Override public void onExecutionStart() { System.out.println('TestNG is going to start'); } @Override public void onExecutionFinish() { System.out.println('TestNG is finished'); }
# 4) IInvokedMethodListener
Jest to detektor, który jest wywoływany przed i po wywołaniu metody przez TestNG. Ten odbiornik jest wywoływany tylko w przypadku konfiguracji i metod testowych. Ma tylko dwie metody, tj. AfterInvocation i beforeInvocation.
- przed wezwaniem: Wywołaj przed każdą metodą.
- afterInvocation: Wywołaj po każdej metodzie.
Metoda:
void beforeInvocation (metoda IInvokedMethod, ITestResult testResult)
void afterInvocation (metoda IInvokedMethod, ITestResult testResult)
Przykład:
@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
Ta klasa służy do zmiany listy metod testowych, które ma zostać uruchomione przez TestNG. Korzystając z tej metody, możemy zmienić kolejność na liście metod testowych.
Ma zastosowanie tylko do tych metod, które nie mają zależności, a te metody, które nie są zależne od innych metod testowych, zostaną przekazane w parametrach. Ten interfejs zwróci listę metod testowych, które należy uruchomić, ale w inny sposób posortowany.
Metoda:
jakiego oprogramowania potrzebujesz, aby stworzyć aplikację
Punkt przecięcia java.util.List (metody java.util.List, kontekst ITestContext)
Przykład:
@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
Jest to realizowane przez klientów w celu wygenerowania raportu. Ta metoda zostanie wywołana po uruchomieniu całego pakietu, a parametry podadzą wszystkie wyniki testów, które miały miejsce podczas tego uruchomienia.
Metoda:
void generationReport (java.util.List xmlSuites, java.util.List suites, java.lang.String outputDirectory)
Przykład:
@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(); }
Wniosek
W tym artykule widzieliśmy, jak adnotacje TestNG mogą być przydatne w ułatwianiu logiki naszego programu. Adnotacje są używane w razie potrzeby.
Możesz przekazać parametry do adnotacji i przeprowadzić testy oparte na danych. Możesz uruchamiać przypadki testowe w grupach i oszczędzać czas. Dzięki słuchaczom możesz nawet generować raporty. Nie sądzisz, że to wspaniałe?
TestNG.xml zostanie szczegółowo wyjaśniony w naszym nadchodzącym samouczku. Ten plik XML jest podstawą frameworka TestNG i pomoże nam w wykonywaniu naszych przypadków testowych.
=> Sprawdź idealny przewodnik szkoleniowy TestNG tutaj.
rekomendowane lektury
- Dowiedz się, jak używać adnotacji TestNG w selenie (z przykładami)
- Assertions in Selenium using Junit and TestNG Frameworks
- Wprowadzenie do JUnit Framework i jego wykorzystanie w skrypcie Selenium - Samouczek Selenium # 11
- 30+ najlepszych samouczków dotyczących selenu: naucz się selenu z prawdziwymi przykładami
- Przykład TestNG: jak utworzyć i używać plik TestNG.xml
- Słuchacze JMeter: analiza wyników z różnymi słuchaczami
- Jak używać platformy TestNG do tworzenia skryptów selenium - Samouczek TestNG Selenium nr 12
- Samouczek Eclipse: Integracja TestNG w środowisku Eclipse Java IDE