使用JUnit“完全”重新运行失败的测试脚本

时间:2012-08-08 15:13:40

标签: junit

我找到了一些解决方案,可以在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可以吗? 我不确定我使用的模板是否正确:(

3 个答案:

答案 0 :(得分:4)

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

  1. 您需要创建@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++;                    
    
                }
    
            }
    

    }

  2. retryNeeded() - 确定是否需要重试的方法

    这将重试套件中的所有测试。非常重要的是重试将在@AfterClass方法之后。

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

    1. 您需要创建不允许“发布”失败结果的@Rule。例如:
    2. 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)

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

How to Re-run failed JUnit tests immediately?

答案 2 :(得分:0)

使用Eclipse,在Junit视图中,您有一个“重新运行测试 - 首先失败”按钮

您还可以看到此答案:How to Re-run failed JUnit tests immediately?