Java TestNG:RetryAnalyzer,如果重试时测试成功,则跳过依赖组
我有一个Java TestNG:RetryAnalyzer,如果重试时测试成功,则跳过依赖组,java,testing,testng,integration-testing,Java,Testing,Testng,Integration Testing,我有一个RetryAnalyzer和RetryListener。在RetryListeneronTestFailure中,我检查测试是否可重试,如果是,我将结果设置为成功。我也在这个方法中执行,testResult.getTestContext().getFailedMethods.removeResult(testResult) 我再次在侦听器的onFinish方法中删除失败的结果(带有有效的if条件) 现在我遇到的问题是,我把每个测试类分成了几个组。一个测试类执行写操作,一个测试类执行读操作
RetryAnalyzer
和RetryListener
。在RetryListener
onTestFailure
中,我检查测试是否可重试,如果是,我将结果设置为成功。我也在这个方法中执行,testResult.getTestContext().getFailedMethods.removeResult(testResult)
我再次在侦听器的onFinish
方法中删除失败的结果(带有有效的if条件)
现在我遇到的问题是,我把每个测试类分成了几个组。一个测试类执行写操作,一个测试类执行读操作。所以读组取决于写
如果测试用例在第一次尝试时失败,并在重试时成功,则跳过依赖组中的所有测试用例,尽管在onTestFailure
方法中删除了失败的结果
如果测试用例重试成功,是否有办法运行依赖方法?如果测试用例在所有尝试中都失败,我对该行为没有意见,因此我不想在每个依赖方法上添加
“alwaysRun=true”
。我使用的是TestNG 6.8.7,将其升级到6.9.5
之后,在重试时,TestNG将测试用例标记为跳过。我只需要创建一个监听器,它实现了TestListenerAdapter和override onTestSkipped,如果可以重试,那么从skippedTests中删除该方法
result.getTestContext().getSkippedTests().removeResult(result.getMethod());
如果没有,则将测试设置为失败。现在它可以正常工作。重试时,您应该从失败的测试中删除测试。请确保移除ITestResult对象。(即result,但不是result.getMethod())
@覆盖
公共布尔重试(ITestResult结果){
如果(currentCount
在重试文件中,添加一个机制,以查看案例中是否还剩下重试
在自定义侦听器中,重写onTestSkipped()并检查是否为RetryLeft,将其从skippedResult中删除并返回
public class Retry implements IRetryAnalyzer {
private int count = 0;
private static final List retriedTests = new CopyOnWriteArrayList();
private static final ConcurrentHashMap<String, Boolean> retriedTestsMap = new ConcurrentHashMap();
@Override
public boolean retry(ITestResult iTestResult) {
int maxTry = 3;
if (!iTestResult.isSuccess()) { // Check if test not succeed
String name = getNameForTestResult(iTestResult);
if (count < maxTry) { // Check if maxTry count is reached
count++; // Increase the count count by 1
retriedTests.add(iTestResult);
retriedTestsMap.put(name, true);
RestApiUtil.println("**" + name + " retry count " + count + " **");
iTestResult.setStatus(ITestResult.FAILURE); // Mark test as failed
return true; // Tells TestNG to re-run the test
} else {
iTestResult.setStatus(ITestResult.FAILURE); // If maxCount reached,test marked as failed
retriedTestsMap.put(name, true);
}
} else {
iTestResult.setStatus(ITestResult.SUCCESS); // If test passes, TestNG marks it as passed
}
return false;
}
public static List getRetriedTests() {
return retriedTests;
}
public static boolean isRetryLeft(ITestResult tr) {
return retriedTestsMap.get(getNameForTestResult(tr));
}
private static String getNameForTestResult(ITestResult tr) {
return tr.getTestClass().getRealClass().getSimpleName() + "::" + tr.getName();
}
}
public class CustomTestNGListener extends TestListenerAdapter {
@Override
public void onTestSkipped(ITestResult tr) {
if (Retry.isRetryLeft(tr)) {
tr.getTestContext().getSkippedTests().removeResult(tr);
return;
}
super.onTestSkipped(tr);
}
}
公共类重试实现IRetryAnalyzer{
私有整数计数=0;
private static final List retriedTests=new CopyOnWriteArrayList();
私有静态最终ConcurrentHashMap retriedTestsMap=new ConcurrentHashMap();
@凌驾
公共布尔重试(ITestResult ITestResult){
int-maxTry=3;
如果(!iTestResult.issucess()){//检查测试是否成功
String name=getNameForTestResult(iTestResult);
如果(计数<最大计数){//检查是否达到最大计数
count++;//将计数增加1
retriedTests.add(iTestResult);
retriedTestsMap.put(name,true);
RestApiUtil.println(“**”+name+“重试计数”+count+“**”);
iTestResult.setStatus(iTestResult.FAILURE);//将测试标记为失败
return true;//告诉TestNG重新运行测试
}否则{
iTestResult.setStatus(iTestResult.FAILURE);//如果达到最大计数,则测试标记为失败
retriedTestsMap.put(name,true);
}
}否则{
iTestResult.setStatus(iTestResult.SUCCESS);//如果测试通过,TestNG将其标记为通过
}
返回false;
}
公共静态列表getRetriedTests(){
返回重试测试;
}
公共静态布尔值isRetryLeft(ITestResult tr){
返回retriedTestsMap.get(getNameForTestResult(tr));
}
私有静态字符串getNameForTestResult(ITestResult tr){
返回tr.getTestClass().getRealClass().getSimpleName()+“:”+tr.getName();
}
}
公共类CustomTestNGListener扩展TestListenerAdapter{
@凌驾
已跳过公共void onTestSkipped(ITESTRSULT tr){
如果(重试isRetryLeft(tr)){
tr.getTestContext().getSkippedTests().removeResult(tr);
返回;
}
super.onTestSkipped(tr);
}
}
public class Retry implements IRetryAnalyzer {
private int count = 0;
private static final List retriedTests = new CopyOnWriteArrayList();
private static final ConcurrentHashMap<String, Boolean> retriedTestsMap = new ConcurrentHashMap();
@Override
public boolean retry(ITestResult iTestResult) {
int maxTry = 3;
if (!iTestResult.isSuccess()) { // Check if test not succeed
String name = getNameForTestResult(iTestResult);
if (count < maxTry) { // Check if maxTry count is reached
count++; // Increase the count count by 1
retriedTests.add(iTestResult);
retriedTestsMap.put(name, true);
RestApiUtil.println("**" + name + " retry count " + count + " **");
iTestResult.setStatus(ITestResult.FAILURE); // Mark test as failed
return true; // Tells TestNG to re-run the test
} else {
iTestResult.setStatus(ITestResult.FAILURE); // If maxCount reached,test marked as failed
retriedTestsMap.put(name, true);
}
} else {
iTestResult.setStatus(ITestResult.SUCCESS); // If test passes, TestNG marks it as passed
}
return false;
}
public static List getRetriedTests() {
return retriedTests;
}
public static boolean isRetryLeft(ITestResult tr) {
return retriedTestsMap.get(getNameForTestResult(tr));
}
private static String getNameForTestResult(ITestResult tr) {
return tr.getTestClass().getRealClass().getSimpleName() + "::" + tr.getName();
}
}
public class CustomTestNGListener extends TestListenerAdapter {
@Override
public void onTestSkipped(ITestResult tr) {
if (Retry.isRetryLeft(tr)) {
tr.getTestContext().getSkippedTests().removeResult(tr);
return;
}
super.onTestSkipped(tr);
}
}