2012-08-08 74 views
2

我发现了一些解决方案,在此论坛中重新运行失败的@Test How to Re-run failed JUnit tests immediately?。在我的情况下,我从命令行执行测试。如果失败,我想重新运行完整的测试。下面给出我的测试脚本,模板,我想重新运行一切(从开始到结束),如果失败使用JUnit重新运行失败的测试脚本'完全'

@BeforeClass 
public static void Start(){ 
... 
} 

@Test 
public void Test_One(){ 
... 
} 

@Test 
public void Test_Two(){ 
... 
} 

@AfterClass 
public static void End(){ 
... 
} 

我会在知道到底()方法,如果我的测试脚本已失败。如果它失败了,我想运行像

@BeforeClass 
@Test (all @Test) 
@AfterClass 

是否有可能与JUnit? 我不知道如果我使用的模板是正确的:(

回答

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你可以通过尝试重试的次数。

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

+0

感谢您的解决方案user1459144。 – JanakiL 2014-11-26 05:46:07

0

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

你也可以看到这样的回答: How to Re-run failed JUnit tests immediately?

+0

我从命令行运行我的测试脚本。所以我不能使用eclipse重新运行。我确实提到了你提到的帖子。就像我之前提到的那篇文章,该链接讨论了如何单独重新运行失败的@Test。但我想运行BeforeClass> Test> AfterClass。 – JanakiL 2012-08-09 05:00:57