如果测试失败,请重试TestNG代码中的特定代码,而不是整个测试

时间:2019-06-21 20:19:07

标签: java testng

如果TestNG测试失败,我想重试一些方法特定的代码,而不是重试整个测试。

我从https://github.com/haojiwu/testng-retry-example处开始研究了自定义测试监听器和重试分析器。如果我要一些方法特定的代码失败,它将重新运行整个测试。

df1.join(df2, on=['rid', 'tid'])

我想在doSomething(param1)中执行代码,如果断言失败,请尝试使用assertStuff(var1,var2)中的东西,我想等待5秒钟,然后重试assertStuff(var1,var2)代码如果断言通过,则测试通过,否则重试最多2次。

3 个答案:

答案 0 :(得分:0)

您可能想使用TestNG retryAnalyzer功能,但仅用于>>> def a(x): ... if x: ... print('x') ... else: ... print('y') ... >>> a([]) y >>> a([1]) x >>> a([1,2]) x >>> [] == True False >>> [1,2] == True False 部分。

因此,您应该将assertStuff(var1, var2)移到单独的方法中,并用doSomething(param1)(或@BeforeClass注释):

@BeforeMethod

或者,您可以使用... @BeforeClass public void initSomething() { doSomething(param1); } @Test(retryAnalyzer = ThreeRetries.class) public void testStuff() { String var1; String var2; assertStuff(var1, var2); } 注释作为必填部分,并声明测试之间的依赖关系,例如:

@Test

答案 1 :(得分:0)

一种无需依赖RetryAnalyzer即可完成此操作的简便方法(如果您未使用最新的Beta版本,即7.0.0-beta5或更高版本,则RetryAnalyzer的一个问题是您需要承担修剪的责任重试产生的重复测试结果。

您可以改为围绕assertStuff()方法构建一个简单的轮询机制,并使其返回您可以声明的truefalse

这是一个例子。为了简便起见,由于org.openqa.selenium.support.ui.FluentWait的API非常简洁,因此我一直在使用

import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.function.Supplier;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.support.ui.FluentWait;
import org.testng.Assert;
import org.testng.annotations.Test;

public class TestClass {
  private static final int max = 5;

  @Test
  public void testStuff() {
    doSomething();
    boolean wasAsserted = assertStuff(2);
    Assert.assertTrue(wasAsserted);
  }

  @Test
  public void testStuffThatFails() {
    doSomething();
    boolean wasAsserted = assertStuff(10);
    Assert.assertTrue(wasAsserted);
  }

  private boolean assertStuff(int retries) {
    final AtomicInteger integer = new AtomicInteger(0);
    Supplier<Integer> input = integer::getAndIncrement;
    FluentWait<Supplier<Integer>> checker =
        new FluentWait<>(input)
            .pollingEvery(Duration.ofSeconds(2))
            .withTimeout(Duration.ofSeconds(10));
    try {
      return checker.until(getCondition(retries));
    } catch (TimeoutException e) {
      return false;
    }
  }

  private Function<Supplier<Integer>, Boolean> getCondition(int retries) {
    return integerSupplier -> {
      int current = integerSupplier.get();
      return current == retries || current > max;
    };
  }

  private void doSomething() {
    System.err.println("I did something");
  }
}

答案 2 :(得分:0)

简单地说,我们也尝试这样

2019-06-22 20:55:35.553331 [DEBUG] statsd_init print data to 127.0.0.1:8125 and length: 9, 0