跳过的测试未在 ExtentReport4 中记录为已跳过
Skipped test is not logged as Skipped in ExtentReport4
我进行了 2 项测试:addNewVideo
和 deleteRecentVideo
,其中第二项取决于第一项。在第一次失败后,第二次被忽略,它不是 运行。打开我的 Extent Report 后,它看起来像这样:
我希望进行 2 次测试 - 1 次失败,1 次跳过,但报告中未正确显示。
ExtentListener.class
import com.aventstack.extentreports.*;
import com.aventstack.extentreports.markuputils.*;
import org.testng.*;
import java.util.*;
import static constants.FileResources.REPORT_DIR;
public class ExtentListener implements ITestListener {
private static Date d = new Date();
private static String fileName = String.format("%s%s%s%s", d.toString().replaceAll("[: ]", "_"), "_", System.getenv("env"), ".html");
private static ExtentReports extent = ExtentManager.createInstance(REPORT_DIR + fileName);
public static ThreadLocal<ExtentTest> testReport = new ThreadLocal<>();
@Override
public void onTestStart(ITestResult result) {
ExtentTest test = extent.createTest(result.getTestClass().getName() + "." + result.getMethod().getMethodName());
test.assignCategory(result.getTestClass().getName());
testReport.set(test);
}
@Override
public void onTestSuccess(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String logText = methodName + " PASSED";
Markup m = MarkupHelper.createLabel(logText, ExtentColor.GREEN);
testReport.get().pass(m);
}
@Override
public void onTestFailure(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String excepionMessage = Arrays.toString(result.getThrowable().getStackTrace());
testReport.get().fail("<details>" + "<summary>" + "<b>" + "<font color=" + "red>" + "Exception occured: Expand to check details"
+ "</font>" + "</b >" + "</summary>" + excepionMessage.replaceAll(",", "<br>") + "</details>" + " \n");
String failureLog = methodName + " FAILED";
Markup m = MarkupHelper.createLabel(failureLog, ExtentColor.RED);
testReport.get().log(Status.FAIL, m);
}
@Override
public void onTestSkipped(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String logText = "<b>" + methodName + " SKIPPED" + "</b>";
Markup m = MarkupHelper.createLabel(logText, ExtentColor.ORANGE);
testReport.get().skip(m);
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
}
@Override
public void onStart(ITestContext context) {
}
@Override
public void onFinish(ITestContext context) {
if (extent != null) {
extent.flush();
}
}
}
我尝试实施 IInvokedMethodListener
但没有成功。
有什么方法可以在 ExtentReport4 上正确显示跳过的测试吗?
我又试了一次 IInvokeMethodListener2
,但这只是一种解决方法。
如果 dependsOnMethods
中的方法失败,则根本不会执行测试方法,因此不会记录为 skipped
。我的解决方案是将依赖方法标记为 description
并在调用之前检查它是否包含来自测试 class.
的任何失败方法
public class MethodListener implements IInvokedMethodListener2 {
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
List<String> failed = context
.getFailedTests()
.getAllMethods()
.stream()
.map(ITestNGMethod::getMethodName)
.collect(Collectors.toList());
boolean isSkippable = false;
if (failed.size() > 0 && method.getTestMethod().getDescription() != null) {
List<String> methodNames = Arrays.asList(method.getTestMethod().getDescription().split(";"));
isSkippable = failed
.stream()
.anyMatch(methodNames::contains);
}
if (isSkippable) {
throw new SkipException("Skipping " + method.getTestMethod().getMethodName());
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
}
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
}
}
@Listeners({MethodListener.class, ExtentListener.class})
public class SampleTest extends TestsBase {
@Test(priority = 1)
public void pass() {
System.out.println("pass");
}
@Test(priority = 2)
public void fail1() {
System.out.println("fail1");
Assert.fail();
}
@Test(priority = 3)
public void fail2() {
System.out.println("fail2");
Assert.fail();
}
@Test(priority = 4)
public void fail3() {
System.out.println("fail3");
Assert.fail();
}
@Test(priority = 5)
public void fail4() {
System.out.println("fail4");
Assert.fail();
}
@Test(priority = 6, description = "pass;fail2")
public void skip1() {
System.out.println("skip1");
}
@Test(priority = 7, description = "pass;fail3")
public void skip2() {
System.out.println("skip2");
}
}
伙计们,我也遇到过这个问题,下面的代码对我有用。
像这样定义 testListener,然后在 Baseclass 开始之前使用 @listeners(TestListeners.class) 在你的 Baseclass 中调用这个 testListenerclass。
注意 : 我用过Spark Extentreport
public class TestListeners 实现 ITestListener {
@覆盖
public 无效 onTestSkipped(ITestResult 结果){
Baseclass.extenttest = Baseclass.extent.createTest(result.getMethod().getDescription()).assignCategory("SkipedTest");
Baseclass.extenttest .log(Status.SKIP, result.getThrowable());
Baseclass.extenttest .log(Status.SKIP, result.getMethod().getDescription());
Baseclass.extenttest .log(Status.SKIP, MarkupHelper.createLabel(result.getName(), ExtentColor.YELLOW));
Baseclass.extent.flush();
}
}
在你的测试中class像下面这样定义@Test
@Test(description = "测试用例名称", dependsOnMethods = { "所依赖的方法名称" })
我进行了 2 项测试:addNewVideo
和 deleteRecentVideo
,其中第二项取决于第一项。在第一次失败后,第二次被忽略,它不是 运行。打开我的 Extent Report 后,它看起来像这样:
我希望进行 2 次测试 - 1 次失败,1 次跳过,但报告中未正确显示。
ExtentListener.class
import com.aventstack.extentreports.*;
import com.aventstack.extentreports.markuputils.*;
import org.testng.*;
import java.util.*;
import static constants.FileResources.REPORT_DIR;
public class ExtentListener implements ITestListener {
private static Date d = new Date();
private static String fileName = String.format("%s%s%s%s", d.toString().replaceAll("[: ]", "_"), "_", System.getenv("env"), ".html");
private static ExtentReports extent = ExtentManager.createInstance(REPORT_DIR + fileName);
public static ThreadLocal<ExtentTest> testReport = new ThreadLocal<>();
@Override
public void onTestStart(ITestResult result) {
ExtentTest test = extent.createTest(result.getTestClass().getName() + "." + result.getMethod().getMethodName());
test.assignCategory(result.getTestClass().getName());
testReport.set(test);
}
@Override
public void onTestSuccess(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String logText = methodName + " PASSED";
Markup m = MarkupHelper.createLabel(logText, ExtentColor.GREEN);
testReport.get().pass(m);
}
@Override
public void onTestFailure(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String excepionMessage = Arrays.toString(result.getThrowable().getStackTrace());
testReport.get().fail("<details>" + "<summary>" + "<b>" + "<font color=" + "red>" + "Exception occured: Expand to check details"
+ "</font>" + "</b >" + "</summary>" + excepionMessage.replaceAll(",", "<br>") + "</details>" + " \n");
String failureLog = methodName + " FAILED";
Markup m = MarkupHelper.createLabel(failureLog, ExtentColor.RED);
testReport.get().log(Status.FAIL, m);
}
@Override
public void onTestSkipped(ITestResult result) {
String methodName = result.getMethod().getMethodName();
String logText = "<b>" + methodName + " SKIPPED" + "</b>";
Markup m = MarkupHelper.createLabel(logText, ExtentColor.ORANGE);
testReport.get().skip(m);
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
}
@Override
public void onStart(ITestContext context) {
}
@Override
public void onFinish(ITestContext context) {
if (extent != null) {
extent.flush();
}
}
}
我尝试实施 IInvokedMethodListener
但没有成功。
有什么方法可以在 ExtentReport4 上正确显示跳过的测试吗?
我又试了一次 IInvokeMethodListener2
,但这只是一种解决方法。
如果 dependsOnMethods
中的方法失败,则根本不会执行测试方法,因此不会记录为 skipped
。我的解决方案是将依赖方法标记为 description
并在调用之前检查它是否包含来自测试 class.
public class MethodListener implements IInvokedMethodListener2 {
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
List<String> failed = context
.getFailedTests()
.getAllMethods()
.stream()
.map(ITestNGMethod::getMethodName)
.collect(Collectors.toList());
boolean isSkippable = false;
if (failed.size() > 0 && method.getTestMethod().getDescription() != null) {
List<String> methodNames = Arrays.asList(method.getTestMethod().getDescription().split(";"));
isSkippable = failed
.stream()
.anyMatch(methodNames::contains);
}
if (isSkippable) {
throw new SkipException("Skipping " + method.getTestMethod().getMethodName());
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
}
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
}
}
@Listeners({MethodListener.class, ExtentListener.class})
public class SampleTest extends TestsBase {
@Test(priority = 1)
public void pass() {
System.out.println("pass");
}
@Test(priority = 2)
public void fail1() {
System.out.println("fail1");
Assert.fail();
}
@Test(priority = 3)
public void fail2() {
System.out.println("fail2");
Assert.fail();
}
@Test(priority = 4)
public void fail3() {
System.out.println("fail3");
Assert.fail();
}
@Test(priority = 5)
public void fail4() {
System.out.println("fail4");
Assert.fail();
}
@Test(priority = 6, description = "pass;fail2")
public void skip1() {
System.out.println("skip1");
}
@Test(priority = 7, description = "pass;fail3")
public void skip2() {
System.out.println("skip2");
}
}
伙计们,我也遇到过这个问题,下面的代码对我有用。 像这样定义 testListener,然后在 Baseclass 开始之前使用 @listeners(TestListeners.class) 在你的 Baseclass 中调用这个 testListenerclass。
注意 : 我用过Spark Extentreport
public class TestListeners 实现 ITestListener {
@覆盖 public 无效 onTestSkipped(ITestResult 结果){
Baseclass.extenttest = Baseclass.extent.createTest(result.getMethod().getDescription()).assignCategory("SkipedTest");
Baseclass.extenttest .log(Status.SKIP, result.getThrowable());
Baseclass.extenttest .log(Status.SKIP, result.getMethod().getDescription());
Baseclass.extenttest .log(Status.SKIP, MarkupHelper.createLabel(result.getName(), ExtentColor.YELLOW));
Baseclass.extent.flush();
} }
在你的测试中class像下面这样定义@Test
@Test(description = "测试用例名称", dependsOnMethods = { "所依赖的方法名称" })