当我使用新的测试数据(而不是来自dataprovider的原始数据)重试失败的测试时,我遇到了一个问题。如果我错过了适当的现有主题,请随时指出我的正确方法。
我发现在测试方法失败的情况下也会重试dataprovider方法。我怎样才能重新运行测试方法(使用原始测试数据)?
提前感谢您的帮助。
以下是我的代码的一些部分:
测试类:
@Listeners({RetryTestListener.class})
public class MyClassTest extends FunctionalTest {
private boolean counter = true;
@BeforeTest(alwaysRun = true)
public void beforeTest(ITestContext context) {
for (ITestNGMethod method : context.getAllTestMethods()) {
if(Arrays.asList(method.getGroups()).contains("expectedDataFromUpstream")) {
method.setRetryAnalyzer(new MyClassTest());
}
}
}
@Test(enabled = true, groups = {"expectedDataFromUpstream"}, dataProviderClass = dataProvider="dataProvider")
public void testWithRerun(boolean flag1, boolean flag2) {
if(counter) {
counter = false;
stepHelper().assertThat("Fail result", true, Matchers.equalTo(false));
} else {
counter = true;
stepHelper().assertThat("Pass result", true, Matchers.equalTo(true));
}
}
@DataProvider(name="dataProvider")
public Object[][] dataProvider(Method method) {
return new Object[][] { { getRandomBoolean(), getRandomBoolean() }, { getRandomBoolean(), getRandomBoolean() }, { getRandomBoolean(), getRandomBoolean() }};
}
public boolean getRandomBoolean() {
return Math.random() < 0.5;
}
}
RetryTestListener:
public class RetryTestListener extends TestListenerAdapter {
@Override
public void onTestSuccess(ITestResult result) {
if (result.getMethod().getRetryAnalyzer() != null) {
FunctionalTest retryAnalyzer = (FunctionalTest)result.getMethod().getRetryAnalyzer();
retryAnalyzer.setDefaultCurrentCounterValue();
}
}
@Override
public void onTestFailure(ITestResult result) {
if (result.getMethod().getRetryAnalyzer() != null) {
FunctionalTest retryAnalyzer = (FunctionalTest)result.getMethod().getRetryAnalyzer();
if(retryAnalyzer.isRetryAvailable()) {
result.setStatus(ITestResult.SKIP);
} else {
result.setStatus(ITestResult.FAILURE);
}
Reporter.setCurrentTestResult(result);
}
}
}
IRetryAnalyzer:
public abstract class FunctionalTest extends BaseFunctionalTest implements IRetryAnalyzer {
private static int currentCounterValue = 1;
public boolean isRetryAvailable() {
return currentCounterValue % 2 != 0;
}
public void setDefaultCurrentCounterValue() {
currentCounterValue = 1;
}
@Override
public boolean retry(ITestResult result) {
if (isRetryAvailable()) {
currentCounterValue++;
return true;
}
setDefaultCurrentCounterValue();
return false;
}
.....
}