跳过的测试未在 ExtentReport4 中记录为已跳过

Skipped test is not logged as Skipped in ExtentReport4

我进行了 2 项测试:addNewVideodeleteRecentVideo,其中第二项取决于第一项。在第一次失败后,第二次被忽略,它不是 运行。打开我的 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 = { "所依赖的方法名称" })