我找到了一些解决方案,可以在How to Re-run failed JUnit tests immediately?的论坛中重新运行失败的@Test。在我的情况下,我从命令行执行测试。如果失败,我想重新运行完整的测试。下面给出的是我的测试脚本模板,如果失败,我想重新运行所有内容(从开始到结束)
@BeforeClass
public static void Start(){
...
}
@Test
public void Test_One(){
...
}
@Test
public void Test_Two(){
...
}
@AfterClass
public static void End(){
...
}
如果我的测试脚本失败,我将在End()方法中了解。如果它失败了,我想运行像
这样的一切@BeforeClass
@Test (all @Test)
@AfterClass
JUnit可以吗? 我不确定我使用的模板是否正确:(
答案 0 :(得分:4)
JanakiL, 这是一个非常好的问题。我试图找到一些解决方案,但我没有设法为这项任务找到干净的解决方案。 我只能建议做一些最终会起作用的解决方法。 因此,为了重新运行套件,您需要执行以下步骤:
您需要创建@ClassRule才能执行整个套件。 您可以使用以下代码重试所有套件:
public class Retrier实现了TestRule {
private int retryCount;
private int failedAttempt = 0;
@Override
public Statement apply(final Statement base,
final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
base.evaluate();
while (retryNeeded()){
log.error( description.getDisplayName() + " failed");
failedAttempt++;
}
}
}
retryNeeded() - 确定是否需要重试的方法
这将重试套件中的所有测试。非常重要的是重试将在@AfterClass方法之后。
如果您需要在成功重试后进行“绿色构建”,则需要编写一堆其他令人沮丧的代码。
public class FailedRule extends TestWatcher {
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
List<Throwable> errors = new ArrayList<Throwable>();
try {
base.evaluate();
} catch (AssumptionViolatedException e) {
log.error("", e.getMessage());
if (isLastRun()) {
throw e;
}
} catch (Throwable t) {
log.error("", t.getMessage());
if (isLastRun()) {
throw t;
}
}
};
};
}
}
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
List<Throwable> errors = new ArrayList<Throwable>();
try {
base.evaluate();
} catch (AssumptionViolatedException e) {
log.error("", e.getMessage());
if (isLastRun()) {
throw e;
}
} catch (Throwable t) {
log.error("", t.getMessage());
if (isLastRun()) {
throw t;
}
}
};
};
}
}
isLastRun() - 验证上次运行和失败测试的方法,仅在最后一次运行ir的情况下。
只需要发布最后一次重试以标记您测试失败并构建“红色”。 3.最后在您的测试课程中,您需要注册两个规则:
@Rule
public FailedRule ruleExample = new FailedRule ();
@ClassRule
public static Retrier retrier = new Retrier (3);
在Retrier中,您可以传递重试次数。
我希望有人能提出更好的解决方案!
答案 1 :(得分:2)
更灵活的解决方案是编写自定义运行器。 我在下面的帖子中描述了这个答案:
答案 2 :(得分:0)
使用Eclipse,在Junit视图中,您有一个“重新运行测试 - 首先失败”按钮