使用Junit重新运行失败的测试

Lor*_*orm 8 java testing junit

我正在努力改进现有的自动化Selenium测试系统.我的目标是重复因连接问题而失败的测试.我发现并试图遵循这个线程如何立即重新运行失败的JUnit测试?这表明它非常有用.

在我的情况下,套件由类组成,所以我试图用@ClassRule替换@Rule,以便重复每次尝试@Before和@After部分.对不起我很抱歉,但我应该把这个规则放在哪里?在我的套件课程中?或者在代表测试的类中?

Mat*_*ell 5

我是如何立即重新运行失败的 JUnit 测试的原始回答者?

如果我理解正确的话,你所遇到的问题是由于在对@Before的代码之前被执行RetryRule,并且@After存在之后执行。

所以你目前的行为是这样的:

@Before
@Retry
test code
@Retry
@After
Run Code Online (Sandbox Code Playgroud)

但是您可以实施您的@Before@After作为一项规则 - 有一个规则ExternalResource可以做到这一点。您将实施@Before@After作为一项规则:

@Rule public ExternalResource beforeAfter = new ExternalResource() {
    public void before() {
        // code that was in @Before
    }

    public void after() {
        // code that was in @After
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你不需要@Beforeand @After。然后,您可以使用RuleChain链接这些规则。这会强制执行您的规则的顺序:

@Rule public RuleChain chain= RuleChain
                       .outerRule(new LoggingRule("outer rule")
                       .around(new LoggingRule("middle rule")
                       .around(new LoggingRule("inner rule");
Run Code Online (Sandbox Code Playgroud)

所以你的最终解决方案是这样的:

private ExternalResource beforeAfter = ...
private RetryRule retry = ...

@Rule public RuleChain chain = RuleChain
                               .outerRule(retry)
                               .around(beforeAfter);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用的是RuleChain,则不再需要and@Rule上的注释,但需要在.ExternalResourceRetryRuleRuleChain


Bri*_*ian 0

您可以使用或属性来修饰测试名称本身:@After@Afterclass

@After
@Test
@Category(SmokeTests.class)
public void testProductPageOnly() throws TimeoutException {
   //Some tests here.
}

@Afterclass
public static void SomeTest {
   //Some test here.
}
Run Code Online (Sandbox Code Playgroud)

需要注意的事情,@Afterclass总会;即使您使用的@Beforeclass是引发异常的 a。

  • 这是否总是会运行测试两次,而不仅仅是第一次失败? (2认同)
  • 但如果第一次通过,第二次失败,就会报告失败,失败的可能性是他的两倍。 (2认同)