gpt4 book ai didi

java - 如何立即重新运行失败的 JUnit 测试?

转载 作者:IT老高 更新时间:2023-10-28 11:48:10 34 4
gpt4 key购买 nike

有没有办法拥有一个 JUnit 规则或类似的东西,让每个失败的测试都有第二次机会,只需尝试再次运行它。

背景:我有大量用 JUnit 编写的 Selenium2-WebDriver 测试。由于非常激进的时间安排(点击后只有很短的等待时间),一些测试(100 次中的 1 次,并且总是不同的测试)可能会失败,因为服务器有时会响应较慢。但是我不能让等待时间太长以至于它绝对足够长,因为那样测试将永远持续。) - 所以我认为这个用例即使需要第二个测试也是绿色的也是可以接受的试试看。

当然,最好有 3 个多数中的 2 个(重复失败的测试 3 次,如果其中两个测试正确,则认为它们是正确的),但这将是 future 的改进。

最佳答案

您可以使用 TestRule 来执行此操作.这将为您提供所需的灵 active 。 TestRule 允许您在测试周围插入逻辑,因此您将实现重试循环:

public class RetryTest {
public class Retry implements TestRule {
private int retryCount;

public Retry(int retryCount) {
this.retryCount = retryCount;
}

public Statement apply(Statement base, Description description) {
return statement(base, description);
}

private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;

// implement retry logic here
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
return;
} catch (Throwable t) {
caughtThrowable = t;
System.err.println(description.getDisplayName() + ": run " + (i+1) + " failed");
}
}
System.err.println(description.getDisplayName() + ": giving up after " + retryCount + " failures");
throw caughtThrowable;
}
};
}
}

@Rule
public Retry retry = new Retry(3);

@Test
public void test1() {
}

@Test
public void test2() {
Object o = null;
o.equals("foo");
}
}

TestRule 的核心是调用您的测试方法的base.evaluate()。所以围绕这个调用你放了一个重试循环。如果在您的测试方法中抛出异常(断言失败实际上是 AssertionError),则测试失败,您将重试。

还有另一件事可能有用。您可能只想将此重试逻辑应用于一组测试,在这种情况下,您可以在 Retry 类中为方法上的特定注释添加测试上方的测试。 Description 包含方法的注释列表。有关这方面的更多信息,请参阅我对 How to run some code before each JUnit @Test method individually, without using @RunWith nor AOP? 的回答。 .

使用自定义 TestRunner

这是CKuck的建议,你可以定义自己的Runner。您需要延长 BlockJUnit4ClassRunner并覆盖 runChild()。有关更多信息,请参阅我对 How to define JUnit method rule in a suite? 的回答.这个答案详细说明了如何定义如何为套件中的每个方法运行代码,您必须为此定义自己的 Runner。

关于java - 如何立即重新运行失败的 JUnit 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295100/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com