Selenium - 如果发生灾难性错误,优雅地中止测试 - 但生成测试报告

Selenium - abort the tests gracefully if a catastrophic error occurs - but generate test report

我已经查看了关于此主题的现有 questions/answers,但没有看到任何与我的问题相关的内容。

首先,我的测试自动化使用两个侦听器 - TestListenerCustomReportListener - 以及带有 Selenium Webdriver 的 TestNG 框架 测试网站。

问题是:如果在其中一项测试中检测到临界条件,我如何终止其余测试(即测试套件的其余部分) - 但仍生成邮寄给测试人员的测试报告?

运行 进入关键问题的测试将被标记为失败,但其余(理想情况下)将被标记为已跳过。

终止测试最简单的方法是使用System.exit(1)。我试过了,但它终止了测试过程——因此,没有创建测试报告。

您可以使用 TestListener 跳过剩余的测试。 在你的测试方法中,如果临界条件已经发生,那么你必须在 ITestContext 对象中设置一个属性:

@Test
public void testCase(ITestContext ctx) {
    //.....rest of the code....

    if(/*the critical condition*/) {
        ctx.setAttribute("criticalFailure", true);
    }

    // or if you are expecting an exception to identify the critical issue..
    try {
        // code which you expect may throw the critical exception
    } catch (YourExpectedException e) {
        ctx.setAttribute("criticalFailure", true);
    }
}

现在在您的侦听器中,检查是否设置了此属性。

public class TestListener implements ITestListener {

    @Override
    public void onTestStart(ITestResult result) {
        // Note that you should not use result.getAttribute because
        // in the test method, we have set the attribute in the test context.
        // (ITestResult is not available in test methods)

        Object isCritical = result.getTestContext().getAttribute("criticalFailure");
        if (isCritical != null && (boolean) isCritical) {
            throw new SkipException("Critical error occurred");
        }
    }
}

如果您将所有失败都视为严重错误,那就容易多了。您不必更改测试方法中的任何内容。唯一的变化是在您的测试侦听器中。

public class TestListener implements ITestListener {

    @Override
    public void onTestFailure(ITestResult result) {
        result.setAttribute("failed", true);
    }

    @Override
    public void onTestStart(ITestResult result) {
        Object failed = result.getAttribute("failed");
        if (failed != null && (boolean) failed) {
            throw new SkipException("Critical error occurred");
        }
    }
}