testng annotations listeners
이 튜토리얼은 TestNG 주석 및 리스너의 다양한 유형을 설명합니다. 또한 예제와 함께 TestNG 주석 및 리스너를 사용하는 방법을 배웁니다.
여기에서는 TestNG 어노테이션을 사용하여 기본 TestNG 프로그램을 실행하고 TestNG 리스너의 역할과이를 테스트에 사용하는 방법을 살펴 봅니다.
=> Easy TestNG 교육 시리즈를 읽어보십시오.
학습 내용 :
TestNG 주석이란 무엇입니까?
메서드 흐름을 제어하는 데 사용되는 프로그램 또는 비즈니스 논리입니다. 그들은 TestNG에서 매우 중요한 역할을합니다. 이러한 주석은 요구 사항에 따라 각 프로젝트에서 다릅니다. 각기 다른 요구 사항에도 불구하고 주석의 흐름은 모든 프로그램에서 동일하게 유지됩니다.
TestNG를 JUnit보다 쉽고 더 좋게 만드는 여러 유형의 TestNG 주석이 있습니다. 이러한 각 주석은 TestNG의 특정 이벤트에서 실행됩니다.
TestNG의 주석 유형
다음은 TestNG에서 사용되는 주석 및 해당 속성 목록입니다. 이들과 그 사용법을 자세히 살펴 보겠습니다.
전에
- @BeforeSuite : 이 메서드는 제품군의 모든 테스트가 실행되기 전에 실행됩니다.
- @BeforeTest : 이 메소드는 스위트에서 각 테스트 섹션이 선언되기 전에 실행됩니다.
- @BeforeClass : 이 메서드는 현재 클래스의 첫 번째 테스트 메서드보다 먼저 실행됩니다.
- @BeforeMethod : 이 메서드는 각 테스트 메서드 전에 실행됩니다.
- @BeforeGroups : 이 메서드는 지정된 그룹의 테스트 메서드가 언급되기 전에 실행됩니다.
- @테스트 : 클래스 또는 메서드를 테스트의 일부로 표시합니다. 또는 테스트 방법으로 방법을 만든다고 말할 수 있습니다.
후
- @AfterSuite : 이 메서드는 제품군의 모든 테스트가 실행 된 후에 실행됩니다.
- @AfterTest : 이 메소드는 스위트에서 각 테스트 섹션이 선언 된 후에 실행됩니다.
- @방과후: 이 메서드는 클래스의 마지막 테스트 메서드 이후에 실행됩니다.
- @AfterMethod : 이 메서드는 각 테스트 메서드가 실행 된 후에 실행됩니다.
- @AfterGroups : 이 메서드는 지정된 그룹의 마지막 테스트 메서드가 실행 된 후에 실행됩니다.
주석 작업 흐름
TestNG.xml 파일을 실행하면 TestNG 주석이 다음 순서로 실행됩니다.
스위트 전-> 테스트 전-> 수업 전-> 메소드 전-> @ 테스트-> 메소드 후-> 수업 후-> 테스트 후-> 스위트 후
@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite
@테스트 테스트 케이스를보다 효과적으로 실행하는 데 도움이되는 많은 다른 속성이 있습니다.
다음은 속성 유형 및 설명과 예제입니다.
# 1) alwaysRun : true로 설정하면 실패한 메소드에 종속 된 경우에도이 메소드가 실행됩니다.
예: 테스트 (alwaysRun = true)
# 2) dataProvider :이 메서드에 대한 데이터 공급자의 이름을 표시합니다. 속성, 즉 이름 만 있습니다. 입력 시간 또는 실행 시간에 여러 데이터 세트로 소프트웨어를 테스트 할 때 사용할 수 있습니다. 이를 데이터 기반 테스트라고도합니다. 이 속성을 사용하여 데이터 기반 테스트를 수행 할 수 있습니다.
예: @dataProvider (이름 =”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 (enabled = false)로 설정하여 특정 테스트를 무시 / 비활성화 할 수 있습니다.
예:
@Test(enabled = false) public void imageTest() {//We have disabled this test by giving enabled=false System.out.println(“Image was tested successfully()”); }
# 9) expectedExceptions :이 속성은 테스트 메서드가 런타임에 throw 할 예외 목록을 표시합니다. 메서드에 대해 예외 또는 기타 예외가 발생하지 않으면 테스트가 실패로 표시됩니다.
예:
@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로 주석 처리 된 메서드를 선언 한 다음 @Test 주석의 'DataProvider'속성을 사용하여 필요한 테스트 메서드에서이 메서드를 사용해야합니다.
데이터 공급자는 개체 배열, 특히 2 차원 개체 배열 () ()을 반환합니다. 첫 번째 배열은 데이터 세트를 나타내고 두 번째 배열은 매개 변수를 포함합니다.
@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) @ 팩토리 : 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
이름 : Kumar 28242
이것은 메시지 메서드에서 데이터 수를 늘리면 인쇄 메서드가 같은 횟수로 실행된다는 것을 보여줍니다.
@Factory 예 :
TestNG Factory는 단일 테스트 클래스를 사용하여 여러 테스트 클래스를 실행해야 할 때 매우 유용합니다.
예를 보겠습니다.
이를 위해 내부에 테스트 메서드가 거의없는 두 개의 테스트 클래스를 만들어야합니다.
테스트 데이터 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'); } }
이제 위에서 정의한 클래스의 객체 배열을 반환하는 @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 테스트 방법
통과 : test1
통과 : test2
유형이있는 TestNG 리스너
간단히 말해서 리스너는 Selenium 스크립트에 정의 된 이벤트를 수신하고 그에 따라 동작합니다. 주요 목적은 로그를 생성하고 TestNG 보고서를 사용자 지정하는 것입니다.
TestNG에는 다양한 유형의 리스너가 있습니다.
예를 들면 , IAnnotationTransformer, IAnnotationTransformer2, IConfigurable, IConfigurationListener, IConfigurationListener2, IExecutionListener, IHookable, IInvokedMethodListener, IInvokedMethodListener2, IMethodInterceptor, IReporter, ISuiteListener, ITest
그러나 테스트와 관련하여 아래에 설명 된대로 몇 가지만 사용합니다.
# 1) ISuiteListener
이것은 테스트 스위트의 리스너입니다. 두 가지 방법으로 구성됩니다. onStart () 과 onFinish () .
이 리스너를 구현할 때마다 최종 사용자가 TestNG 제품군을 실행하기 전후에 onStart () 및 onFinish () 메서드를 호출하도록 보장합니다.
방법 세부 정보 :
void onStart (ISuite 제품군) :이 메소드는 Suite Runner가 시작되기 전에 호출됩니다.
무효 onFinish (ISuite 스위트) :이 메소드는 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가 아닌 테스트 전후에 호출한다는 것입니다. 테스트 실행을위한 리스너이며이 리스너에는 7 개의 메소드가 있습니다.
(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가 완료된 후 호출됩니다.
방법:
무효 onExecutionStart ()
무효 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의 두 가지 메서드 만 있습니다.
- 호출 전 : 각 메소드 전에 호출하십시오.
- afterInvocation : 각 메소드 다음에 호출하십시오.
방법:
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 generateReport (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 프레임 워크의 중추이며 테스트 케이스를 실행하는 데 도움이됩니다.
=> 여기에서 Perfect TestNG 교육 가이드를 확인하십시오.
추천 도서
- Selenium에서 TestNG 주석을 사용하는 방법 알아보기 (예제 포함)
- Junit 및 TestNG 프레임 워크를 사용하는 Selenium의 어설 션
- JUnit 프레임 워크 소개 및 Selenium 스크립트에서의 사용법 – Selenium Tutorial # 11
- 30 개 이상의 최고의 셀레늄 튜토리얼 : 실제 예제로 셀레늄 배우기
- TestNG 예제 : TestNG.xml 파일을 만들고 사용하는 방법
- JMeter 리스너 : 다른 리스너로 결과 분석
- TestNG 프레임 워크를 사용하여 Selenium 스크립트를 작성하는 방법-TestNG Selenium Tutorial # 12
- Eclipse 튜토리얼 : Eclipse Java IDE에서 TestNG 통합