3

我在如何立即重新运行失败的 JUnit 测试?. 就我而言,我从命令行执行测试。如果失败,我想重新运行完整的测试。下面给出的是我的测试脚本模板,如果失败,我想重新运行所有内容(从头到尾)

@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可以吗?我不确定我使用的模板是否正确:(

4

3 回答 3

4

JanakiL,这是一个非常好的问题。我试图找到一些解决方案,但我没有设法为这项任务找到干净的解决方案。我只能建议做一些最终可行的解决方法。因此,为了重新运行套件,您需要执行以下步骤:

  1. 您需要创建 @ClassRule 才能执行整个套件。您可以使用以下代码重试所有套件:

    公共类 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 方法非常重要。

如果您需要在成功重试后进行“绿色构建”,您需要编写一堆其他令人沮丧的代码。

  1. 您需要创建不允许“发布”失败结果的@Rule。例如:

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

        };
}   
}

isLastRun() – 验证它是否是最后一次运行的方法,并且仅在最后一次运行 ir 的情况下才会通过测试。

只需要发布最后一次重试以标记您的测试失败并构建“红色”。3. 最后在你的测试类中你需要注册两条规则:

@Rule
public FailedRule ruleExample = new FailedRule ();
@ClassRule 
public static Retrier retrier = new Retrier (3);

在 Retrier 中,您可以传递尝试重试的次数。

我希望有人可以提出更好的解决方案!

于 2013-04-10T21:58:53.887 回答
2

更灵活的解决方案是编写自定义运行器。我在下面的帖子中描述了这个答案:

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

于 2013-12-24T15:08:49.920 回答
0

使用 Eclipse,在 Junit 视图中,您有一个按钮“ReRun Tests - Failures First”

您还可以看到这个答案:如何立即重新运行失败的 JUnit 测试?

于 2012-08-08T15:19:09.703 回答