gpt4 book ai didi

java - 如何让 JUnit 4.8 在测试失败后但在任何 @After 方法之前运行代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:46 24 4
gpt4 key购买 nike

我正在使用 JUnit 4.8.2 驱动一套 Selenium 测试(实际上是 WebDriver 支持的 Selenium)。我希望测试在断言失败后立即自动截取浏览器的屏幕截图。所有测试都继承自 SeleniumBaseTestCase,然后大多数测试进一步继承自 SeleniumBastTestCaseWithCompany(使用 @Before@After 方法来创建然后通过 Selenium 清理常见的测试数据)。

我尝试在 SeleniumBaseTestCase 中添加 TestWatchman 的子类作为 @Rule,覆盖 TestWatchman' s failed 截取屏幕截图的方法。问题是 @After 清理测试数据的方法在 TestWatchmanfailed 方法被调用之前运行,所以截图是所有清理的最后一步,而不是失败的测试。

稍微研究一下,似乎 TestWatchmanapply 方法只是调用传递的 Statement 的 evaluate 方法(唯一的exposed 方法),它调用 @After 方法,让 TestWatchman(或任何其他 Rule)没有机会在执行之间插入任何代码据我所知,测试和 @After 方法。

我还看到了创建自定义 Runner 来更改创建的 Statement 的方法,以便用自定义 @AfterFailure 注释的方法在 @After 方法之前运行(因此可以在这样的 @AfterFailure 方法中截取屏幕截图),但这依赖于覆盖 BlockJUnit4ClassRunner withAfters 方法,根据 documentation,该方法已被弃用并将成为私有(private)方法,这建议改用规则。

我在 SO 上找到了另一个关于 @Rule lifecycle 的答案这听起来像是在 JUnit 4.8 中根本不可能,但在 JUnit 4.10 中可能是可能的。如果那是正确的,那么很公平,我只想先确认一下。

任何关于我可以实现我想要的优雅和面向 future 的方式的想法都将不胜感激!

最佳答案

您的分析是正确的,@Befores 和@Afters 被添加到任何规则之前的语句列表中。 @Before@Rule 之后执行,而 @After@Rule 之前执行。如何解决此问题取决于您使用 SeleniumBaseTestCaseWithCompany 的灵 active 。

最简单的方法是删除您的@Before/@After 方法并将它们替换为ExternalResource。 .这可能看起来像:

public class BeforeAfterTest {
@Rule public TestRule rule = new ExternalResource() {
protected void before() throws Throwable { System.out.println("externalResource before"); }
protected void after() { System.out.println("externalResource after"); }
};

@Test public void testHere() { System.out.println("testHere"); }
}

这给出:

externalResource before
testHere
externalResource after

这个字段可以放在你的基类中,所以它会被继承/覆盖。您在 @After 和您的规则之间进行排序的问题就会消失,因为您可以使用 @RuleChain 随意排序您的规则。 (在 4.10 中,不是 4.8)。

如果您不能更改SeleniumBaseTestCaseWithCompany,那么您可以扩展BlockJUnit4ClassRunner,但不要覆盖withAfters,而是覆盖BlockJUnit4ClassRunner#methodBlock() .然后您可以调用 super.methodBlock,并根据需要重新排序语句[*]。

[*]您可以只复制代码,然后重新排列行,但是 withRules 是私有(private)的,因此不能从子类调用。

关于java - 如何让 JUnit 4.8 在测试失败后但在任何 @After 方法之前运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8564172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com