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

重新运行失败的测试脚本';完全';使用JUnit,junit,Junit,我在这个论坛上找到了一些解决方案来重新运行failed@Test。在我的例子中,我从命令行执行测试。如果失败,我想重新运行完整的测试。下面给出的是我的测试脚本模板,如果失败,我想重新运行一切(从开始到结束) @BeforeClass public static void Start(){ ... } @Test public void Test_One(){ ... } @Test public void Test_Two(){ ... } @AfterClass public stati

我在这个论坛上找到了一些解决方案来重新运行failed@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可以吗?
我不确定我使用的模板是否正确:(

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

你也可以看到这个答案:

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

  • 为了执行整个套件,您需要创建@ClassRule。 您可以使用以下代码重试所有套件:

    公共类检索器实现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方法之后进行

    如果您需要在成功重试后进行“绿色构建”,那么您需要编写一组另一个令人沮丧的代码

  • 您需要创建不允许“发布”失败结果的@Rule。例如:
  • 
    公共类FailedRule扩展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;
                        }
                    }
                };
    
            };
    }   
    }
    

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


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

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


    我从命令行运行我的测试脚本。因此我不能使用eclipse重新运行。我确实参考了您提到的帖子。就像我之前提到的帖子一样,该链接讨论了如何单独重新运行失败的@test。但是我想运行BeforeClass>test>AfterClass。感谢user1459144提供的解决方案。
    @Rule
    public FailedRule ruleExample = new FailedRule ();
    @ClassRule 
    public static Retrier retrier = new Retrier (3);