TestNG侦听器

时间:2020-02-23 14:41:56  来源:igfitidea点击:

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
===============================================