testng annotations listeners
Този урок обяснява различните типове анотации и слушатели на TestNG. Също така ще научите как да използвате TestNG анотации и слушатели с примери:
Тук ще стартираме основна програма TestNG, използвайки анотации на TestNG, а също така ще видим ролята на слушателите на TestNG и как да ги използваме при тестване.
=> Прочетете серията Easy TestNG Training.
Какво ще научите:
- Какво представляват анотациите на TestNG?
- Видове анотации в TestNG
- Слушатели на TestNG с типове
- Заключение
Какво представляват анотациите на TestNG?
Това са програмната или бизнес логика, които се използват при контролиране на потока от методи. Те играят много важна роля в TestNG. Тези пояснения се различават във всеки проект според изискванията. Потокът от пояснения остава един и същ във всяка програма, въпреки различните изисквания.
Има различни видове анотации на TestNG, които правят TestNG по-лесен и по-добър от JUnit. Всяка от тези анотации ще се изпълнява на определено събитие в TestNG.
Видове анотации в TestNG
По-долу са дадени списъците с анотации и техните атрибути, които се използват в TestNG. Нека да ги изследваме в детайли.
Преди
- @BeforeSuite: Този метод ще бъде изпълнен преди да бъдат изпълнени всички тестове в пакета.
- @BeforeTest: Този метод ще бъде изпълнен, преди всеки тестов раздел да бъде деклариран в пакета.
- @BeforeClass: Този метод ще бъде изпълнен преди първия тестов метод в текущия клас.
- @BeforeMethod: Този метод ще бъде изпълнен преди всеки метод за изпитване.
- @BeforeGroups: Този метод ще бъде изпълнен преди да бъде споменат който и да е метод за тестване на посочената група.
- @Тест : Маркира клас или метод като част от теста. Или можем да кажем, че прави метод като тест метод.
След
- @AfterSuite: Този метод ще бъде изпълнен, след като всички тестове в пакета са изпълнени.
- @AfterTest: Този метод ще бъде изпълнен, след като всеки тестов раздел бъде деклариран в пакета.
- @След часовете: Този метод ще бъде изпълнен след последния тестов метод от класа.
- @AfterMethod: Този метод ще бъде изпълнен след изпълнението на всеки тестов метод.
- @AfterGroups: Този метод ще бъде изпълнен след изпълнението на последния тестов метод на посочената група.
Работен поток от анотации
Когато изпълним файла TestNG.xml, анотациите TestNG ще бъдат изпълнени в следната последователност:
Преди Suite-> Преди тест-> Преди клас-> Преди метод-> @Test -> След метод-> След клас-> След тест-> След пакет
@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite
@Тест има много други атрибути, които ни помагат при по-ефективното изпълнение на нашите тестови случаи.
По-долу са видовете атрибути и техните описания с примери.
# 1) alwaysRun: Когато е зададено на true, този метод ще се изпълнява, дори ако зависи от метод, който е неуспешен.
Пример: Тест (alwaysRun = true)
# 2) dataProvider : Това показва името на доставчика на данни за този метод. Той има само атрибути, т.е.име. Можем да го използваме, когато тестваме нашия софтуер с множество набори от данни по време на въвеждане или време на изпълнение. Това е известно и като тестване на данни. Можем да направим тестване на данни, използвайки този атрибут.
Пример: @dataProvider (name = ”TestData”)
# 3) dataProviderClass : Този атрибут ще ви позволи да посочите класа на доставчика на данни, който ще съдържа доставчика на данни, който ще използва методът @Test.
Пример: @Test (dataProvider = „Тест на клиентски данни“, dataProviderClass = ClientDetailsTest.class)
# 4) dependOnGroups : Този атрибут зависи от списъка с групи, т.е. тестовият метод ще започне изпълнение само след изпълнението на зависимите групи.
Забележка : Ако някой от тестовете в групите, които зависят от това, не успее, той ще пропусне този тест.
По-долу е примерът:
@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) dependOnMethods : Тази анотация зависи от списъка с методи. Това означава, че тестовият метод ще започне изпълнението само след като бъдат изпълнени зависимите методи.
Забележка : Ако някой от тестовете в зависими методи не успее, той ще го пропусне.
Пример:
@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: Можем да зададем атрибутите на тестов метод на true и това ще принуди теста да бъде изпълнен, дори ако някои от тестовете в групата зависят от неуспех.
Например:
@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) описание : Това предоставя описанието на метода. Като цяло, той съдържа резюме от един ред.
Пример:
@Test(description = “Regression Test Summary”)
# 8) активиран : Този атрибут помага при определяне дали искаме да стартираме / изпълним конкретния метод за тестване в текущия пакет / клас или не. Понякога не искаме да изпълняваме няколко теста поради някои причини, като изискването / функцията често се променя и не искаме да нарушаваме текущото изпълнение на тази функция.
В тези случаи можем просто да игнорираме / деактивираме този конкретен тест, като зададем тази функция като @Test (разрешено = невярно).
Пример:
@Test(enabled = false) public void imageTest() {//We have disabled this test by giving enabled=false System.out.println(“Image was tested successfully()”); }
# 9) очаквани изключения : Този атрибут показва списъка с изключения, които тестовият метод ще въведе по време на изпълнение. Ако за метода не се хвърлят изключения или други изключения, тогава тестът се маркира като неуспех.
Пример:
@Test(expectedExceptions = ArithmeticException.class) public void numericTest() { int i = 1 / 0; }
# 10) групи : Този атрибут се използва за определяне на групите, към които принадлежи тестовият метод.
@Test(groups = {“Regression”}) Public void runRegressionTest(){ System.out.println(“test runs were successful”); }
# 11) приоритет : Това помага за приоритизиране на методите за тестване, докато приоритетът по подразбиране започва с 0 и тестовете се изпълняват във възходящ ред.
Пример:
@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”); }
Резултати: По-долу са дадени резултатите по приоритет, въпреки че на първия тест не е зададен номер, той по подразбиране приема приоритета си като 0 и изпълнението е извършено във възходящ ред.
Приет: launchApp
Предадено: loginApp
Приет: checkTrans
# 12) таймаут : Този атрибут помага при задаване на стойност на времето за изчакване за теста (обикновено се използва като милисекунди). Ако тестът отнеме повече от определената стойност за изчакване, тогава тестът се отбелязва като неуспешен. Можем да използваме този таймаут за извършване на тест за ефективност, за да сме сигурни, че методът се връща в разумен срок.
@Test(timeOut = 500) public void timeTest() throws InterruptedException { Thread.sleep(400); System.out.println(“Time test method successfully tested”); }
# 13) invocationCount : Този атрибут помага при определяне на броя пъти, в които даден метод за тестване трябва да бъде извикан.
@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();
Изход:
Заглавието на страницата е Google
Заглавието на страницата е Google
Заглавието на страницата е Google
Заглавието на страницата е Google
Заглавието на страницата е Google
# 14) invocationTimeOut: Това е максималното време (не милисекунди), което този тест трябва да отнеме за всички извиквания. Този метод трябва да се използва заедно с метода на извикване, в противен случай той ще бъде игнориран.
Пример:
@Test(invocationCount=4, invocationTimeOut=4000) public void loginTest(){ Thread.sleep(1000); System.Out.println(“login Test”); }
Горният пример показва, че изпълнението на този тест ще отнеме общо 4 секунди и всеки път, когато тестът бъде извикан / стартиран, ще отнеме 1 секунда.
# 15) @DataProvider : Този метод помага при предоставянето на данни за тестов метод. Първо, трябва да декларираме метод, коментиран от @DataProvider и след това да използваме този метод в необходимия метод за тестване, използвайки атрибута “DataProvider” в анотацията @Test.
Доставчикът на данни връща масив от обекти, особено двуизмерен масив от обекти () (). Първият масив представлява набор от данни, а вторият масив съдържа параметрите.
@DataProvider (name = “Test”) - Тук името представлява името на доставчика на данни. Ако името не е дадено, тогава името на DataProvider автоматично ще се зададе на името на метода.
Пример:
@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 : Използва се за определяне на метод като фабрика за предоставяне на обекти, които трябва да се използват от TestNG за неговите тестови класове. Използвайки @Factory, можем да създадем динамични тестове по време на изпълнение и той трябва да върне масивен обект.
Пример:
Нека вземем пример, за да го разберем по-добре. Ще създадем два класа, т.е. FactorySample.Java и 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; } }
Изход : Google стартира успешно
Gmail влезе успешно
Разлика между анотациите на @Factory и @DataProvider
Има основна разлика между двете анотации. Има много объркване по отношение на тези две анотации като къде да ги използвам и защо?
Нека намерим отговорите.
@DataProvider: Тази анотация ще параметризира конкретния метод на тестване и ще изпълни теста в конкретен номер. пъти въз основа на данните, предоставени от този метод.
Например, ако има два параметъра, тогава тестовият метод ще бъде изпълнен два пъти. Например, ако искаме да влизаме в сайт с различни набори от потребителски имена и пароли всеки път, тогава това е полезно, тъй като трябва да предоставим параметрите за тестване.
@Фабрика : Това ще изпълни всички тестови методи, налични във файла на тестовия клас, докато се използва отделен екземпляр на този клас. Това е полезно, ако искаме да стартираме тестовия клас произволен брой пъти.
Например , ако трябва да тестваме функцията за вход на някое приложение или уебсайт и тъй като трябва да стартираме този тест няколко пъти, по-добре е да използваме @Factory, където можем да създадем множество екземпляри на тест и да стартираме тестовете.
Нека да разгледаме тези примери, за да разберем разликата.
Пример за @DataProvider :
@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); }
Забележка : В горната програма предоставихме две данни и резултатът от програмата ще бъде:
Имената са: Mihir 145632
Имената са: Кумар 28242
Това показва, че ако увеличим броя на данните в метода за съобщения, методът за печат ще изпълни същия брой пъти.
@Factory Пример :
TestNG Factory е много полезен, когато трябва да стартираме множество тестови класове, като използваме един тестов клас.
Нека да видим пример.
За това трябва да създадем два тестови класа с малко методи за тестване вътре в тях.
Тестови данни 1:
public class TestData1 { @Test public void testData1() { System.out.println('Test data 1 successfully tested'); } }
Тестови данни 2:
public class TestData2 { @Test public void testData2() { System.out.println('Test data 2 successfully tested'); } }
Сега трябва да дефинираме метода @Factory, който връща масив от обекти на по-горе дефинираните класове.
Фабрична програма:
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; } }
Изход:
Test1 метод за изпитване
Test2 метод за изпитване
ПРИЛОЖЕН: тест1
ПРИЛОЖЕН: тест2
Слушатели на TestNG с типове
С прости думи, слушателите слушат събитието, дефинирано в скрипта на Selenium, и се държат съответно на него. Основната цел е да се създават регистрационни файлове и да се персонализират отчетите TestNG.
В TestNG има много видове слушатели.
Например , IAnnotationTransformer, IAnnotationTransformer2, IConfigurable, IConfigurationListener, IConfigurationListener2, IExecutionListener, IHookable, IInvokedMethodListener, IInvokedMethodListener2, IMethodInterceptor, IReporter, ISuiteListner
Когато става въпрос за тестване, ние използваме само няколко от тях, както е обсъдено по-долу:
# 1) ISuiteListener
Това е слушател за тестови пакети. Състои се от два метода, т.е. onStart () и onFinish () .
Всеки път, когато внедрим този слушател, той ще гарантира, че крайният потребител ще извика методите onStart () и onFinish () преди и след стартиране на пакет TestNG.
Подробности за метода:
void onStart (ISuite suite) : Този метод се извиква преди стартирането на Suite Runner.
void onFinish (ISuite suite) : Този метод се извиква, след като Suite Runner е изпълнил всички тестови пакети.
Пример:
@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
Този слушател работи точно като ISuiteListener. Единствената разлика обаче е, че той се обажда преди и след теста, а не Suite. Това е слушател за пробно изпълнение и в него има седем метода.
(i) onStart () :Този метод се извиква, след като тестовият клас е създаден и преди да бъде извикан всеки метод за конфигуриране.
Пример:
@Override public void onStart(ITestContext context) { System.out.println(“Context Name = ” + context.getName()); }
(ii) onFinish () :Този метод се извиква след изпълнение на всички тестове и извикване на всички методи за конфигуриране.
Пример:
public void onFinish(ITestContext context) { System.out.println(context.getPassedTests()); }
(iii) onTestStart () :Този метод се извиква всеки път, преди да бъде извикан тест. ITestResult е само частично попълнен с препратки към клас, метод, начални мили и статус.
Метод: void onTestStart (резултат от ITestResult)
Пример:
@Override public void onTestStart(ITestResult result) { System.out.println('Test Started…'+result.getStartMillis()); }
(iv) onTestSuccess () :Този метод се извиква всеки път, когато тестът успее.
Метод: void onTestSuccess (резултат от ITestResult)
Пример:
@Override public void onTestSuccess(ITestResult result) { System.out.println('Test Success. '+result.getEndMillis()); }
(v) onTestFailure () :Този метод се извиква всеки път, когато тестът е неуспешен.
Метод: void onTestFailure (резултат от ITestResult)
Пример:
@Override public void onTestFailure(ITestResult result) { System.out.println('Test Failed. '+result.getTestName()); }
(vi) onTestSkipped () :Този метод се извиква всеки път, когато се пропуска тест.
Метод: void onTestSkipped (резултат от ITestResult)
Пример:
@Override public void onTestSkipped(ITestResult result) { System.out.println('Test Skipped. '+result.getTestName()); }
(vii) onTestFailedButWithinSuccessPercentage :Този метод се извиква всеки път, когато методът е неуспешен, но е бил анотиран с процент на успех и неуспехът го поддържа в рамките на процента на успех.
Метод: void onTestFailedButWithinSuccessPercentage (резултат от ITestResult)
Пример:
@Override public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { System.out.println('Test failed but it is in defined success ratio ' + getTestMethodName(iTestResult)); }
# 3) IExecutionListener
Това е слушател, който следи началото и края на изпълнение на TestNG. Той има два метода, т.е. onExecutionStart () и onExecutionFinish () .
Методът onExecutionStart () се извиква преди TestNG да започне да изпълнява пакетите, а методът onExecutionFinish () се извиква, след като TestNG приключи с изпълнението на всички тестови пакети.
Метод:
void onExecutionStart ()
void onExecutionFinish ()
Пример:
@Override public void onExecutionStart() { System.out.println('TestNG is going to start'); } @Override public void onExecutionFinish() { System.out.println('TestNG is finished'); }
# 4) IInvokedMethodListener
Това е слушател, който се извиква преди и след извикване на метод от TestNG. Този слушател се извиква само за конфигурации и методи за тестване. В него има само два метода, т.е. afterInvocation и beforeInvocation.
- преди призоваване: Призовавайте преди всеки метод.
- след призоваване: Призовавайте след всеки метод.
Метод:
void beforeInvocation (метод IInvokedMethod, ITestResult testResult)
void afterInvocation (метод IInvokedMethod, ITestResult testResult)
Пример:
@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
Този клас се използва за промяна на списъка с тестови методи, които TestNG ще изпълнява. С помощта на този метод можем да пренаредим списъка с методи за тестване.
Той е приложим само за тези методи, които нямат зависими и тези методи, които не зависят от други методи за изпитване, ще бъдат предадени в параметри. Този интерфейс ще върне списък с тестови методи, които трябва да бъдат изпълнени, но по различен начин.
Метод:
коя е най-добрата програма за почистване на вашия компютър
java.util.List прихващане (java.util.List методи, контекст на ITestContext)
Пример:
@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
Това се прилага от клиентите за генериране на отчет. Този метод ще бъде извикан, след като целият пакет е стартиран и параметрите дават всички резултати от теста, които са се случили по време на това изпълнение.
Метод:
void createReport (java.util.List xmlSuites, java.util.List suites, java.lang.String outputDirectory)
Пример:
@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(); }
Заключение
В тази статия видяхме как анотациите на TestNG могат да бъдат полезни за улесняване на логиката на нашата програма. При необходимост се използват анотации.
Можете да предавате параметрите на анотациите и да правите тестване на данни. Можете да стартирате тестовите случаи в групи и да спестите време. Със слушателите можете дори да генерирате отчетите. Не мислите ли, че това е прекрасно?
TestNG.xml ще бъде обяснено подробно в нашия предстоящ урок. Този XML файл е гръбнакът на рамката TestNG и ще ни помогне при изпълнението на нашите тестови случаи.
=> Вижте тук идеалното ръководство за обучение на TestNG.
Препоръчително четене
- Научете как да използвате TestNG анотации в селен (с примери)
- Твърдения в селен с помощта на рамки Junit и TestNG
- Въведение в JUnit Framework и нейното използване в Selenium Script - Селен Урок # 11
- 30+ най-добри урока за селен: Научете селен с реални примери
- Пример за TestNG: Как да създадете и използвате файла TestNG.xml
- Слушатели на JMeter: Анализиране на резултатите с различни слушатели
- Как да използвам TestNG Framework за създаване на селенови скриптове - TestNG Selenium Tutorial # 12
- Урок за Eclipse: Интегриране на TestNG в Eclipse Java IDE