如何在TestNG的Emailable Report中显示@BeforeMethod与@AfterMethod日志
解决TestNG @BeforeMethod/@AfterMethod日志不显示在emailable-report.html的问题
这个问题挺常见的,默认情况下TestNG的Reporter.log()单参数调用只会输出到控制台,不会关联到测试方法的结果上下文,所以emailable-report.html不会收录这些日志。你只需要调整日志的调用方式,就能让Before/After方法的日志完美出现在报告里。
核心解决方案:使用Reporter.log()的双参数重载
Reporter.log(String message, boolean logToStandardOut)方法的第二个参数传true,会把日志绑定到当前执行的测试方法,这样TestNG的报告生成器就能捕获到这些日志并展示在emailable-report.html中。
修改后的示例代码
import java.io.IOException; import java.lang.reflect.Method; import org.testng.Reporter; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class AutoItTest { @BeforeMethod(alwaysRun = true) public void initialize(Method method) { // 第二个参数传true,将日志关联到测试方法上下文 Reporter.log("Reporter before", true); String methodName = method.getName(); int parameterCount = method.getParameterCount(); String className = this.getClass().getCanonicalName(); Reporter.log("methodName: " + methodName, true); Reporter.log("parameterCount: " + parameterCount, true); Reporter.log("className: " + className, true); long threadId = Thread.currentThread().getId(); Reporter.log("threadId before: " + threadId, true); Test test = method.getAnnotation(Test.class); if (test == null) { return; } Reporter.log(test.testName() + " is currently running", true); Reporter.log(test.description() + " was its description", true); } @AfterMethod(alwaysRun = true) public void uninitialize(Method method) { Reporter.log("Reporter after", true); String methodName = method.getName(); int parameterCount = method.getParameterCount(); String className = this.getClass().getCanonicalName(); long threadId = Thread.currentThread().getId(); Reporter.log("threadId after: " + threadId, true); Reporter.log("methodName: " + methodName, true); Reporter.log("parameterCount: " + parameterCount, true); Reporter.log("className: " + className, true); } @Test(groups = "vdi") public void VDITest() throws IOException, Exception { Reporter.log("VDITest", true); Reporter.log("Reporter VDITest", true); long threadId = Thread.currentThread().getId(); Reporter.log("threadId VDITest: " + threadId, true); } @Test(groups = "vdi") public void VDITest123() throws IOException, Exception { Reporter.log("VDITest123", true); long threadId = Thread.currentThread().getId(); Reporter.log("threadId VDITest123: " + threadId, true); } }
原理说明
- 单参数的
Reporter.log(String):日志仅输出到控制台,不会被TestNG的测试结果对象(ITestResult)捕获,自然不会出现在报告里。 - 双参数的
Reporter.log(String, true):日志会被添加到当前测试方法的ITestResult日志集合中,emailable-report.html生成时会遍历每个测试方法的ITestResult,从而展示这些绑定的日志。
验证方法
运行你的测试套件后,打开test-output目录下的emailable-report.html,你会看到每个测试方法的详情里,会按顺序显示@BeforeMethod的日志、测试方法本身的日志、@AfterMethod的日志,完全整合到报告中。
内容的提问来源于stack exchange,提问作者Suresh Kumar
相关产品推荐
相关产品推荐

