TestNG: otázky na pohovor

TestNG je jedným z najpoužívanejších testovacích frameworkov na unit aj automatizované testovanie. V tomto návode sme pre vás pripravili najčastejšie kladené otázky a odpovede na pohovory o testNG pre nováčikov v tejto oblasti a aj pre tých skúsenejších.
Otázka 1. Čo je TestNG?
Odpoveď: TestNG (NG ako Next Generation) je testovací framework, ktorý možno integrovať so Selenium alebo akýmkoľvek iným automatizačným nástrojom, aby poskytoval viaceré možnosti, ako sú assertions(tvrdenia), reporting (správy), paralelné vykonávanie testov atď.
Otázka 2. Aké sú niektoré výhody TestNG?
Odpoveď: Výhody TestNG sú:
- TestNG poskytuje rôzne assertions (tvrdenia), ktoré pomáhajú pri kontrole očakávaných a skutočných výsledkov.
- Poskytuje paralelné vykonávanie testovacích metód.
- V TestNG môžeme definovať závislosť jednej testovacej metódy od ostatných.
- Testovacím metódam v Selenium môžeme priradiť prioritu.
- Umožňuje zoskupovanie testovacích metód do testovacích skupín.
- Umožňuje testovanie riadené údajmi (data-driven testing) pomocou anotácie @DataProvider.
- Má neodmysliteľnú podporu reportovania.
- Má podporu parametrizácie testovacích prípadov pomocou anotácie @Parameters.
Otázka 3. Ako sa TestNG líši od Selenium WebDriver?
Odpoveď: Selenium je automatizačný nástroj, pomocou ktorého môžeme automatizovať webové aplikácie. S cieľom pridať testovacie možnosti do testovacích automatizačných sád – Selenium je prepojené s TestNG. Pomocou TestNG môžeme mať v našej automatizačnej sade rôzne funkcie, ako sú rôzne typy tvrdení, reportovanie, paralelné vykonávanie, parametrizácia atď.
Stručne povedané, na vykonávanie automatizačného testovania Selenium pomáha s „automatizáciou“ a TestNG pomáha s možnosťami „testovania“.
Otázka 4. Na čo sa používa súbor testng.xml?
Odpoveď: Súbor testng.xml sa používa na konfiguráciu celej testovacej sady. V súbore testng.xml môžeme vytvoriť sadu testov, vytvoriť skupiny testov, označiť testy na paralelné vykonávanie, pridať listeners (poslucháčov) a odovzdať parametre testovacím skriptom. Tento súbor testng.xml môžeme použiť aj na spúšťanie testovacej sady z príkazového riadku/terminálu alebo Jenkins.
Otázka 5. Ako môžeme zoskupiť testovacie prípady ako samostatné testovacie prípady pre Sanity suite, Regression suite atď.
Odpoveď: Pomocou atribútu groups v TestNG môžeme testovacie metódy priradiť do rôznych skupín.
//Testovacia metóda patriaca len do sanity suite
@Test(groups = {"sanitySuite"})
public void testMethod1() {
//Testovacia logika
}
//Testovacia metóda patriaca do sady sanity aj regresnej sady
@Test(groups = {"sanitySuite", "regressionSuite"})
public void testMethod2() {
//Testovacia logika
}
Otázky 6. Ako môžeme vylúčiť testovaciu metódu z vykonávania prostredníctvom súboru testng.xml?
Odpoveď: Pomocou značky exclude v súbore testng.xml môžeme vylúčiť konkrétnu testovaciu metódu z vykonávania.
<suite name="Test Suite" verbose="1">
<test name="TestName">
<classes>
<class name="TestClassName">
<methods>
<exclude name="testMethodToBeExcluded"/>
</methods>
</class>
</classes>
</test>
</suite>
Otázky 7. Aké sú niektoré bežne používané anotácie TestNG?
Odpoveď: Bežne používané anotácie TestNG sú:
- @Test – anotácia @Test označuje metódu ako metódu Test.
- @BeforeSuite – Metóda s anotáciou sa spustí len raz, predtým ako sa spustia všetky testy v tejto sade.
- @AfterSuite – Metóda s anotáciou sa spustí len raz po spustení všetkých testov v tejto sade.
- @BeforeClass – Metóda s anotáciou sa spustí iba raz pred vyvolaním prvej testovacej metódy v aktuálnej triede.
- @AfterClass – Metóda s anotáciou sa spustí len raz po spustení všetkých testovacích metód v aktuálnej triede.
- @BeforeTest – Metóda s anotáciou sa spustí pred spustením akejkoľvek testovacej metódy patriacej do tried vnútri značky <test>.
- @AfterTest – Anotovaná metóda sa spustí po spustení všetkých testovacích metód patriacich do tried vnútri značky <test>.
- @BeforeMethod – Anotovaná metóda sa spustí pred každou testovacou metódou označenou anotáciou @Test.
- @AfterMethod – Anotovaná metóda sa spustí po každej testovacej metóde označenej anotáciou @Test.
- @DataProvider – Anotácia @DataProvider sa používa na odovzdanie testovacích údajov testovacej metóde. Testovacia metóda sa spustí podľa počtu riadkov údajov odovzdaných prostredníctvom metódy poskytovateľa údajov.
Otázka 8. Aké je poradie vykonávania testovacej metódy na základe rôznych anotácií?
Odpoveď: Testovacie metódy v TestNG sa vykonávajú v poradí Suite->Test->Class->Method v kombinácii s poradím Before annotations->Test annotations->After annotations. Takže poradie vykonávania je takéto:
@BeforeSuite
@BeforeTest
@BeforeClass
@BeforeMethod
@Test
@AfterMethod
@AfterClass
@AfterTest
@AfterSuite
Otázka 9. Aké sú niektoré bežné tvrdenia (assertions), ktoré poskytuje TestNG?
Odpoveď Niektoré z bežných tvrdení, ktoré poskytuje testNG, sú:
- assertEquals(String actual, String expected, String message) a ďalšie preťažené dátové typy v parametri
- assertNotEquals(double data1, double data2, String message) a iné preťažené dátové typy v parametri
- assertFalse(boolean condition, String message)
- assertTrue(boolean condition, String message)
- assertNotNull(Object object)
- fail(boolean condition, String message)
- true(String message)
Otázka 10. Ako môžeme zakázať alebo zabrániť spusteniu testovacieho prípadu?
Odpoveď: Nastavením atribútu „enabled“ na hodnotu false môžeme zakázať spustenie testovacej metódy.
//V prípade testovacej metódy
@Test(enabled = false)
public void testMethod1() {
//Testovacia logika
}
//V prípade testovacej metódy patriacej do skupiny
@Test(groups = {"NegativeTests"}, enabled = false)
public void testMethod2() {
//Testovacia logika
}
Otázka 11. Ako môžeme pomocou TestNG vytvoriť závislosť jednej testovacej metódy od iných?
Odpoveď: Pomocou parametra dependsOnMethods v anotácii @Test v TestNG môžeme dosiahnuť, aby sa jedna testovacia metóda spustila až po úspešnom vykonaní závislej testovacej metódy.
@Test(dependsOnMethods = { „preTests“ })
Otázka 12. Ako môžeme nastaviť prioritu testovacích prípadov v TestNG?
Odpoveď: Prioritu testovacích prípadov môžeme definovať pomocou parametra „priority“ v anotácii @Test. Testy s nižšími hodnotami priority sa vykonajú ako prvé. Príklad:
@Test(priority=1)
Otázka 13. Aká je predvolená priorita testovacích prípadov v TestNG?
Odpoveď: Predvolená priorita testu, ak nie je špecifikovaná, je celočíselná hodnota 0. Ak teda máme jeden testovací prípad s prioritou 1 a jeden bez priority, potom sa najprv vykoná test bez akejkoľvek hodnoty priority (keďže predvolená hodnota bude 0 a najprv sa vykonajú testy s nižšou prioritou).
Otázka 14. Ako môžeme spustiť testovaciu metódu viackrát v cykle (bez použitia akéhokoľvek poskytovateľa údajov – data provider)?
Odpoveď: Použitím parametra invocationCount a nastavením jeho hodnoty na celočíselnú hodnotu sa testovacia metóda spustí n-krát v cykle.
@Test(invocationCount = 10)
public void invocationCountTest(){
//Testovacia logika
}
Otázky 15. Čo je threadPoolSize? Ako ju môžeme použiť?
Odpoveď: Atribút threadPoolSize určuje počet vlákien, ktoré sa majú priradiť testovacej metóde. Používa sa v spojení s atribútom invocationCount. Počet vlákien sa vydelí počtom iterácií testovacej metódy uvedených v atribúte invocationCount.
@Test(threadPoolSize = 5, invocationCount = 10)
public void threadPoolTest(){
//Testovacia logika
}
Otázka 16. Aký je rozdiel medzi soft assertion a hard assertion v TestNG?
Odpoveď: Toto je jedna z najčastejšie kladených otázok na pohovore o TestNG. Mäkké tvrdenia (SoftAssert) nám umožňujú mať v rámci testovacej metódy viacero tvrdení, aj keď niektoré tvrdenie zlyhá, testovacia metóda pokračuje vo zvyšnom vykonávaní testu. Výsledok všetkých assertions sa dá na konci zhrnúť pomocou metódy softAssert.assertAll().
@Test
public void softAssertionTest(){
SoftAssert softAssert= new SoftAssert();
//Assertion failing
softAssert.fail();
System.out.println("Failing");
//Assertion passing
softAssert.assertEquals(1, 1);
System.out.println("Passing");
//Collates test results and marks them pass or fail
softAssert.assertAll();
}
Tu, aj keď prvé tvrdenie zlyhá, test bude pokračovať vo vykonávaní a vypíše správu pod druhým tvrdením.
Na druhej strane tvrdé tvrdenia (hard assertions) sú obvyklé tvrdenia, ktoré poskytuje TestNG. V prípade tvrdého tvrdenia sa v prípade akéhokoľvek zlyhania vykonávanie testu zastaví, čím sa zabráni vykonaniu akýchkoľvek ďalších krokov v rámci testovacej metódy.
Otázka 17. Ako zlyhať test v testNG, ak sa nevykoná v stanovenom čase?
Odpoveď: Môžeme použiť atribút timeOut anotácie @Test. Hodnota priradená tomuto atribútu timeOut bude fungovať ako horná hranica. Ak sa test nevykoná v tomto časovom rámci, potom zlyhá s výnimkou timeout.
@Test(timeOut = 1000)
public void timeOutTest() throws InterruptedException {
//Sleep for 2sec so that test will fail
Thread.sleep(2000);
System.out.println("Will throw Timeout exception!");
}
Otázka 18. Ako môžeme podmienečne preskočiť testovací prípad?
Odpoveď: Pomocou funkcie SkipException môžeme podmienečne preskočiť testovací prípad. Pri vyhodení skipException sa testovacia metóda v správe o vykonaní testu označí ako preskočená a žiadny príkaz po vyhodení výnimky sa nevykoná.
@Test
public void testMethod(){
if(conditionToCheckForSkippingTest)
throw new SkipException("Skipping the test");
//test logic
}
Otázka 19. Ako môžeme zabezpečiť, aby sa testovacia metóda spustila aj vtedy, keď testovacie metódy alebo skupiny, od ktorých závisí, zlyhajú alebo sa preskočia?
Odpoveď: Pomocou atribútu „alwaysRun“ anotácie @Test môžeme zabezpečiť, aby sa testovacia metóda spustila, aj keď testovacie metódy alebo skupiny, od ktorých závisí, zlyhajú alebo sa preskočia.
@Test
public void parentTest() {
Assert.fail("Failed test");
}
@Test(dependsOnMethods={"parentTest"}, alwaysRun=true)
public void dependentTest() {
System.out.println("Running even if parent test failed");
}
Tu, aj keď parentTest zlyhal, dependentTest nebude preskočený, ale bude vykonaný kvôli „alwaysRun=true“. V prípade, že odstránime atribút „alwaysRun=true“ z @Test, potom správa zobrazí jedno zlyhanie a jeden preskočený test bez toho, aby sa pokúsila spustiť metódu dependentTest.
Otázka 20. Ako môžeme odovzdať parameter testu skriptu pomocou TestNG?
Odpoveď: Pomocou anotácie @Parameter a značky „parameter“ v testng.xml môžeme testovacím skriptom odovzdať parametre.
Ukážka testng.xml:
<suite name="sampleTestSuite">
<test name="sampleTest">
<parameter name="sampleParamName" value="sampleParamValue"/>
<classes>
<class name="TestFile" />
</classes>
</test>
</suite>
Ukážka testovacieho skriptu –
public class TestFile {
@Test
@Parameters("sampleParamName")
public void parameterTest(String paramValue) {
System.out.println("Value of sampleParamName is - " + sampleParamName);
}
Otázka 21. Ako môžeme vytvoriť framework riadený údajmi (data-driven framework) pomocou TestNG?
Odpoveď: Pomocou @DataProvider môžeme vytvoriť framework riadený údajmi, v ktorom sa údaje odovzdajú príslušnej testovacej metóde a spustí sa viacero iterácií testu pre rôzne hodnoty testovacích údajov odovzdaných z metódy @DataProvider. Metóda anotovaná anotáciou @DataProvider vracia 2D pole objektu.
//Data provider returning 2D array of 3*2 matrix
@DataProvider(name = "dataProvider1")
public Object[][] dataProviderMethod1() {
return new Object[][] {{"kuldeep","rana"}, {"k1","r1"},{"k2","r2"}};
}
//This method is bound to the above data provider returning 2D array of 3*2 matrix
//The test case will run 3 times with different set of values
@Test(dataProvider = "dataProvider1")
public void sampleTest(String s1, String s2) {
System.out.println(s1 + " " + s2);
}
Otázka 22. Aké je použitie anotácie @Listener v TestNG?
Odpoveď: TestNG nám poskytuje rôzne druhy poslucháčov, pomocou ktorých môžeme vykonať nejakú akciu v prípade, že sa spustí udalosť. Zvyčajne sa poslucháči TestNG používajú na konfiguráciu hlásení a protokolovania. Jedným z najpoužívanejších poslucháčov v testNG je rozhranie ITestListener. Má metódy ako onTestSuccess, onTestFailure, onTestSkipped atď. Toto rozhranie musíme implementovať vytvorením vlastnej triedy listener. Potom pomocou anotácie @Listener môžeme použiť špecifikáciu, že pre konkrétnu triedu testu sa má použiť naša vlastná trieda poslucháča.
@Listeners(PackageName.CustomizedListenerClassName.class)
public class TestClass {
WebDriver driver= new FirefoxDriver();@Test
public void testMethod(){
//testovacia logika
}
}
Otázka 23. Aké je použitie anotácie @Factory v TestNG?
Odpoveď: Anotácia @Factory pomáha pri dynamickom vykonávaní testovacích prípadov. Pomocou anotácie @Factory môžeme v čase behu odovzdať parametre celej triede testu. Odovzdané parametre môže použiť jedna alebo viac testovacích metód tejto triedy.
Napríklad – existujú dve triedy TestClass a trieda TestFactory. Vďaka anotácii @Factory sa testovacie metódy v triede TestClass spustia dvakrát s údajmi „k1“ a „k2“
public class TestClass{
private String str;
//Constructor
public TestClass(String str) {
this.str = str;
}
@Test
public void TestMethod() {
System.out.println(str);
}
}
public class TestFactory{
//The test methods in class TestClass will run twice with data "k1" and "k2"
@Factory
public Object[] factoryMethod() {
return new Object[] { new TestClass("K1"), new TestClass("k2") };
}
}
Otázka 24. Aký je rozdiel medzi anotáciou @Factory a @DataProvider?
Odpoveď: Metóda @Factory vytvára inštancie testovacej triedy a spúšťa všetky testovacie metódy v tejto triede s inou sadou údajov.
Zatiaľ čo @DataProvider sa viaže na jednotlivé testovacie metódy a spúšťa konkrétne metódy viackrát.
Otázka 25. Ako môžeme pomocou TestNG spúšťať testovacie prípady paralelne?
Odpoveď: Na paralelné spúšťanie testov stačí pridať tieto dva páry kľúč-hodnota do značky suite v súbore testng.xml-
- parallel=“{methods/tests/classes}“
- thread-count=“{počet vlákien, ktoré chcete spustiť súčasne}“.
<suite name=“ITtester“ parallel=“methods“ thread-count=“5″>
Týmto končí náš komplexný zoznam otázok na pohovory s TestNG. Ak sa chcete dozvedieť viac o TestNG, môžete si pozrieť aj náš kompletný – TestNG Tutorial.