当前位置: 首页 > 知识库问答 >
问题:

testng dataprovider和iretrylistener数据问题

唐繁
2023-03-14

当使用新的测试数据(而不是来自数据提供者的原始数据)重试失败的测试时,我遇到了一个问题。如果我错过了适当的现有主题,请随时为我指出正确的方向。

我发现,如果测试方法失败,也会重试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;
 }

 .....
 }

共有1个答案

燕鸿波
2023-03-14

团队已经知道这个问题:https://github.com/cbeust/testng/issues/891

 类似资料:
  • 16. ORM和数据访问

  • 我想使用Cloud Dataflow,PubSub和Bigquery将tableRow写入PubSub消息,然后将它们写入Bigquery。我希望表名、项目id和数据集id是动态的。 我在internet上看到下面的代码,我不明白如何传递数据行参数。 先谢谢你,盖尔

  • 我有spring boot项目(版本< code>2.4.6),带有spring数据依赖项(< code > spring-boot-starter-data-JPA )和postgreSQL驱动程序。 在项目中,我们使用Hibernate和数据存储库,通过以下方式配置: 我还想加入反应性R2DBC。我的计划是在一个特定的地方使用它,在那里我们与其他系统集成,这样的通信通过反应式数据流进行。根据它

  • 我使用的是PrimeFaces 2.2和JSF 2.0.3。 我有一个包含以下数据表的xhtml视图: ..具有以下背衬豆: 注意母亲姓名列上的“commandLink”和出生日期列上的“sortBy”。 我遇到了一个奇怪的问题,似乎仅限于IE,如果我按DOB对数据进行排序,然后分页到最后一页并单击表中最后一条记录的commandLink,它会触发两个action事件。第一个事件正确地报告了我单击

  • 现在,如果我再次打开我的应用程序,并通过Azure.iOS框架查询收集文档,它会返回我刚才保存的结果。这让我感到有点莫名其妙。我是不是错过了应用程序中的某些操作,还是所有的MongoDB工具都无法列出文档?该框架的文档相当稀疏,因此希望提供任何帮助。

  • 15.7 参数和数据处理的常见问题 Spring JDBC框架提供了多个方法来处理常见的参数和数据问题 15.7.1 为参数设置SQL的类型信息 通常Sping通过传入的参数类型决定SQL的参数类型。可以在设定参数值的时候显式提供SQL类型。有些场景下设置NULL值是有必要的。 你可以通过以下方式来设置SQL类型信息: 许多JdbcTemplate的更新和查询方法需要传入额外的int数组类型的参数