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);
   }

}