TestNG侦听器
TestNG侦听器用于检查和修改测试行为。
TestNG侦听器始终扩展" org.testng.ITestNGListener"标记器接口。
可以使用" org.testng.annotations.Listeners"注释为测试类定义TestNG侦听器。
TestNG侦听器
TestNG提供了许多侦听器接口。
它们都扩展了org.testng.ITestNGListener接口。
让我们看一些重要的TestNG侦听器。
ISuiteListener:我们可以使用此测试套件侦听器在测试套件启动时以及在执行所有测试时执行一些操作。
该接口包含两个方法-onStart(ISuite suite)和onFinish(ISuite suite),并提供对测试套件对象的访问。ITestListener
:我们可以使用此侦听器来分析测试方法,执行日志记录。
如果实现任何测试失败,我们也可以使用它们通过实现onTestFailure(ITestResult result)方法来发送通知。IAnnotationTransformer:我们可以实现此接口来修改任何@Test方法的注释。
请注意,我们只能将此注释与TestNG XML配置一起使用。IAnnotationTransformer2:我们可以实现此接口来修改@Test方法以外的任何方法的注释。
该注释只能与TestNG XML配置一起使用。IConfigurable:如果测试类实现了此接口,则将调用其run()方法,而不是找到的每个配置方法。
IConfigurationListener:用于与配置方法有关的事件的侦听器接口。
IExecutionListener:此监听器用于监视TestNG运行的开始和结束时间。
IHookable
:如果测试类实现了此接口,则将调用其run()方法,而不是找到的每个@Test方法。" IInvokedMethodListener":在TestNG调用方法之前和之后调用的侦听器。
IMethodInterceptor:此类用于更改TestNG即将运行的测试方法的列表。
" IReporter":客户端可以实现此接口以生成报告。
TestNG侦听器示例
让我们创建一个简单的TestNG测试类,然后我们将实现一些侦听器并将其添加到该类中。
package com.theitroad.listeners; import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; import org.testng.annotations.Test; public class Test3 { @Test public void test() { System.out.println("Test3 test method"); } @Test(dataProvider = "dp") public void testString(String s) { System.out.println("Test3 testString method, input = "+s); } @DataProvider public Object[] dp() { return new Object[] {"A", "B"}; } }
当我们在上面作为TestNG测试运行时,我们在控制台中获得以下输出。
[RemoteTestNG] detected TestNG version 6.14.3 Test3 test method Test3 testString method, input = A Test3 testString method, input = B PASSED: test PASSED: testString("A") PASSED: testString("B") =============================================== Default test Tests run: 3, Failures: 0, Skips: 0 =============================================== =============================================== Default suite Total tests run: 3, Failures: 0, Skips: 0 ===============================================
ISuiteListener示例
这是ISuiteListener接口的简单实现。
package com.theitroad.listeners; import org.testng.ISuite; import org.testng.ISuiteListener; public class Test3SuiteListener implements ISuiteListener { @Override public void onStart(ISuite suite) { System.out.println("TestNG suite default output directory = "+suite.getOutputDirectory()); } @Override public void onFinish(ISuite suite) { System.out.println("TestNG invoked methods = " +suite.getAllInvokedMethods()); } }
ITestListener示例
这是ITestListener接口的简单实现。
package com.theitroad.listeners; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; public class Test3TestListener implements ITestListener{ public Test3TestListener() { System.out.println("Test3Listener constructor"); } @Override public void onTestStart(ITestResult result) { System.out.println("Test Started. "+result.getStartMillis()); } @Override public void onTestSuccess(ITestResult result) { System.out.println("Test Success. "+result.getEndMillis()); } @Override public void onTestFailure(ITestResult result) { System.out.println("Test Failed. "+result.getTestName()); } @Override public void onTestSkipped(ITestResult result) { System.out.println("Test Skipped. "+result.getTestName()); } @Override public void onTestFailedButWithinSuccessPercentage(ITestResult result) { } @Override public void onStart(ITestContext context) { System.out.println("Context Name = "+context.getName()); } @Override public void onFinish(ITestContext context) { System.out.println(context.getPassedTests()); } }
现在通过将Listeners添加到其类定义中来修改Test3类。
@Listeners({Test3TestListener.class, Test3SuiteListener.class}) public class Test3 { }
当我们再次运行该类作为TestNG测试时,我们得到以下输出。
[RemoteTestNG] detected TestNG version 6.14.3 Test3Listener constructor TestNG suite default output directory = /Users/hyman/Documents/eclipse-github/TestNG-Examples/test-output/Default suite Context Name = Default test Test Started. 1527662805150 Test3 test method Test Success. 1527662805159 Test Started. 1527662805163 Test3 testString method, input = A Test Success. 1527662805164 Test Started. 1527662805165 Test3 testString method, input = B Test Success. 1527662805166 [ResultMap map={[TestResult name=test status=SUCCESS method=Test3.test()[pri:0, instance:com.theitroad.listeners.Test3@291caca8] output={null}]=Test3.test()[pri:0, instance:com.theitroad.listeners.Test3@291caca8], [TestResult name=testString status=SUCCESS method=Test3.testString(java.lang.String)[pri:0, instance:com.theitroad.listeners.Test3@291caca8] output={null}]=Test3.testString(java.lang.String)[pri:0, instance:com.theitroad.listeners.Test3@291caca8], [TestResult name=testString status=SUCCESS method=Test3.testString(java.lang.String)[pri:0, instance:com.theitroad.listeners.Test3@291caca8] output={null}]=Test3.testString(java.lang.String)[pri:0, instance:com.theitroad.listeners.Test3@291caca8]}] PASSED: test PASSED: testString("A") PASSED: testString("B") =============================================== Default test Tests run: 3, Failures: 0, Skips: 0 =============================================== TestNG invoked methods = [Test3.test()[pri:0, instance:com.theitroad.listeners.Test3@291caca8] 689745064, Test3.testString(java.lang.String)[pri:0, instance:com.theitroad.listeners.Test3@291caca8]A 689745064, Test3.testString(java.lang.String)[pri:0, instance:com.theitroad.listeners.Test3@291caca8]B 689745064] =============================================== Default suite Total tests run: 3, Failures: 0, Skips: 0 ===============================================