我有一个不稳定的测试,由于间歇性可重现的错误,每 10-20 次尝试失败一次。我希望在第一次失败后将此测试标记为失败。无需进一步重试。
这是 Test 注释的样子:
@Test(invocationCount = 20, threadPoolSize = 3)
问题是,如果它没有在最后一轮失败 - Allure 报告将其视为“Flaky”测试并且报告是绿色的。我想要实现的是在第一次失败后终止测试方法重试。这个测试在 Allure 报告中应该是红色的。
我有一个不稳定的测试,由于间歇性可重现的错误,每 10-20 次尝试失败一次。我希望在第一次失败后将此测试标记为失败。无需进一步重试。
这是 Test 注释的样子:
@Test(invocationCount = 20, threadPoolSize = 3)
问题是,如果它没有在最后一轮失败 - Allure 报告将其视为“Flaky”测试并且报告是绿色的。我想要实现的是在第一次失败后终止测试方法重试。这个测试在 Allure 报告中应该是红色的。
注释是在运行前设置的,因此一旦运行测试,就无法更改 invocationCount。
您可以做的是使用侦听器在到达时停止执行onTestFailure
。
所以假设你有测试类:
import org.testng.ITestContext;
import org.testng.annotations.Test;
import org.testng.asserts.Assertion;
import org.testng.annotations.Listeners;
@Listeners(TestListener.class)
public class CreateBookingTest extends TestConfig {
@Test(invocationCount = 20)
public void stopInvocationsTest(ITestContext testContext) {
int currentCount = testContext.getAllTestMethods()[0].getCurrentInvocationCount();
// We will force a failure in the invocation 5 (the 6th run).
if (currentCount==5) {
new Assertion().fail("Method failed in invocation " + currentCount);
}
}
}
然后,如果有一个失败,侦听器将中止执行并停止运行其余测试:
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.asserts.Assertion;
public class TestListener implements ITestListener {
@Override
public void onTestStart(ITestResult result) {
System.out.println("\nSTARTING: " + result.getMethod().getCurrentInvocationCount());
}
@Override
public void onTestSuccess(ITestResult result) {
System.out.println("PASSED: " + result.getMethod().getCurrentInvocationCount());
}
@Override
public void onTestFailure(ITestResult result) {
System.out.println("FAILED: " + result.getMethod().getCurrentInvocationCount());
new Assertion().fail("Aborting");
}
@Override
public void onTestSkipped(ITestResult result) {
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
}
@Override
public void onStart(ITestContext context) {
}
@Override
public void onFinish(ITestContext context) {
}
}