gpt4 book ai didi

java - 通过测试监听器删除(复制)失败的 TestNG 结果

转载 作者:搜寻专家 更新时间:2023-10-31 20:27:38 25 4
gpt4 key购买 nike

类似于此处发布的解决方案TestNG retrying failed tests doesn't output the correct test results ,我正在尝试在 onFinish(ITestContext 上下文)期间使用测试监听器删除(重复的)测试结果。

尽管使用 context.getFailedTests().removeResult(result) 删除结果似乎工作正常(结果实际上已删除),但似乎有“其他地方”从中提取结果导致构建仍然失败。

另请注意,当我运行上面文章中的样本测试时(有一个重复的失败被删除,一个通过测试),我得到的“测试结果”(未按预期清理)与“测试结果”有所不同。套件结果”(按预期删除重复故障)。

而且,报告从哪里提取结果来决定构建是否失败?或者它只是在我清理失败的测试之前提取结果......?

===============================================
Default test
Tests run: 3, Failures: 2, Skips: 0
===============================================

===============================================
Default suite
Total tests run: 2, Failures: 1, Skips: 0
===============================================

编辑: 澄清一下,我们正在使用 Maven 运行这些测试,它们是 IT,所以我们使用故障安全插件运行它们。问题是,即使看起来测试已被删除,mvn verify 构建仍然失败,因为它认为无论如何都会发现构建失败。

而且如果从 Eclipse 运行这样的测试,即使测试被删除,当套件完成时,失败仍然会打印在日志中。

关于 RetryAnalyzer: 我根本不会考虑使用 RetryAnalyzer 好的/最佳实践,但是如果您发现自己处于需要解决问题的情况,例如您继承了一个依赖于 RetryAnalyzer 的测试套件,您可能会发现这很有用。

最佳答案

尝试使用这段代码:

ListenerApadter:

public class MyTestListenerAdapter extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result) {
if (result.getMethod().getRetryAnalyzer() != null) {
MyRetryAnalyzer retryAnalyzer = (MyRetryAnalyzer)result.getMethod().getRetryAnalyzer();

if(retryAnalyzer.isRetryAvailable()) {
result.setStatus(ITestResult.SKIP);
} else {
result.setStatus(ITestResult.FAILURE);
}
Reporter.setCurrentTestResult(result);
}
}

@Overrride
public void onFinish(ITestContext context) {
Iterator<ITestResult> failedTestCases =context.getFailedTests().getAllResults().iterator();
while (failedTestCases.hasNext()) {
System.out.println("failedTestCases");
ITestResult failedTestCase = failedTestCases.next();
ITestNGMethod method = failedTestCase.getMethod();
if (context.getFailedTests().getResults(method).size() > 1) {
System.out.println("failed test case remove as dup:" + failedTestCase.getTestClass().toString());
failedTestCases.remove();
} else {

if (context.getPassedTests().getResults(method).size() > 0) {
System.out.println("failed test case remove as pass retry:" + failedTestCase.getTestClass().toString());
failedTestCases.remove();
}
}
}
}
}

重试分析器:

public class MyRetryAnalyzer implements IRetryAnalyzer {
private static int MAX_RETRY_COUNT = 3;

AtomicInteger count = new AtomicInteger(MAX_RETRY_COUNT);

public boolean isRetryAvailable() {
return (count.intValue() > 0);
}

@Override
public boolean retry(ITestResult result) {
boolean retry = false;
if (isRetryAvailable()) {
System.out.println("Going to retry test case: " + result.getMethod() + ", " + (MAX_RETRY_COUNT - count.intValue() + 1) + " out of " + MAX_RETRY_COUNT);
retry = true;
count.decrementAndGet();
}
return retry;
}
}

POM.xml -> Surefire 配置:

这是您应该配置“覆盖”surefire 监听器的地方,它有自己的计数器。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<suiteXmlFiles><suiteXmlFile>${basedir}/testng.xml</suiteXmlFile></suiteXmlFiles>
<properties>
<property>
<name>listener</name>
<value>Utils.MyTestListenerAdapter,Utils.MyRetryAnalizer</value>
</property>
</properties>

关于java - 通过测试监听器删除(复制)失败的 TestNG 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29104427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com