有没有一种方法可以让JUnit规则或类似的东西给每个失败的测试第二次机会,只是尝试再次运行它。
- 背景:我有一个用JUnit编写的大量Selenium 2-WebDriver测试集。(仅在点击后短暂等待)一些测试(100分之一,而且总是不同的)可能会失败,因为服务器有时响应有点慢。但我不能让等待时间这么长,它肯定足够长,因为那样的话,测试将永远持续下去。)--所以我认为对于这个用例来说,测试是绿色的是可以接受的,即使它需要第二次尝试。*
当然,最好是三分之二的多数(重复三次失败的测试,如果其中两次测试正确,就认为它们是正确的),但这将是未来的改进。
7条答案
按热度按时间y1aodyip1#
你可以用TestRule来实现这个功能,这将给予你所需要的灵活性。TestRule允许你在测试中插入逻辑,这样你就可以实现retry循环:
TestRule
的核心是base.evaluate()
,它调用你的测试方法。因此,在这个调用周围放一个retry循环。如果在你的测试方法中抛出了一个异常(Assert失败实际上是一个AssertionError
),那么测试失败了,你将重试。还有一个可能有用的东西。您可能只想将这个重试逻辑应用到一组测试中,在这种情况下,您可以在Retry类中添加一个测试,用于方法上的特定注解。
Description
包含一个方法注解列表。有关此内容的更多信息,请参见我对如何在每个JUnit @Test方法之前单独运行一些代码的回答。而不使用@RunWith或AOP?。使用自定义TestRunner
这是CKuck的建议,你可以定义你自己的Runner。你需要扩展BlockJUnit4ClassRunner并覆盖runChild()。更多信息请参见我对如何在套件中定义JUnit方法规则的回答。这个回答详细说明了如何为套件中的每个方法定义如何运行代码,为此你必须定义自己的Runner。
eqoofvh92#
现在有一个更好的选择。如果你使用的是maven插件,比如:surfire或failefe有一个添加参数
rerunFailingTestsCount
SurFire Api的选项。此功能在以下票证中实现:Jira Ticket。在这种情况下,你不需要写你的自定义代码和插件自动修改测试结果报告。我认为这种方法只有一个缺点:如果某个测试在课前/课后阶段失败,则不会重新运行测试。
velaa5lx3#
至于我写自定义运行更灵活的解决方案。解决方案,张贴以上(与代码示例)有两个缺点:
1.如果在@BeforeClass阶段失败,它将不会重试测试;
1.它计算测试运行有点不同(当您有3次重试时,您将收到测试运行:4、成功1可能令人困惑);
这就是为什么我更喜欢编写自定义runner的方法。自定义runner的代码可以如下:
rm5edbpk4#
建议的评论是根据ob this文章编写的,并添加了一些内容。
这里,如果你的jUnit项目中的某个测试用例得到“失败”或“错误”的结果,这个测试用例将被重新运行一次。这里我们总共设置了3次成功的机会。
因此,我们需要创建规则类并将“@Rule”通知添加到您的测试类。
如果您不想为每个测试类编写相同的“@Rule”通知,则可以将其添加到抽象SetProperty类(如果有)并从其扩展。
规则类别:
测试类别:
k5hmc34c5#
您必须编写自己的
org.junit.runner.Runner
并使用@RunWith(YourRunner.class)
注解您的测试。wooyq4lh6#
至于Junit 5,Junit-pioneer扩展https://junit-pioneer.org/docs/retrying-test/提供了一个很酷的特性@RetryingTest,简单的例子:
这将失败两次,并在第三次执行时显示绿色。
t5fffqht7#
这个答案建立在this answer之上。
如果您需要在每次运行之前重新创建
ActivityScenario
(以及“活动”),您可以使用try-with-resources启动它。ActivityScenario
在每次尝试后都会自动关闭。然后,您可以使用
getScenario()
方法访问测试中的场景。