【发布时间】:2012-01-23 18:01:25
【问题描述】:
我正在使用 JUnit 4.8.2 进行一套 Selenium 测试(实际上是 WebDriver 支持的 Selenium)。我希望测试在断言失败后立即自动截取浏览器的屏幕截图。所有的测试都继承自SeleniumBaseTestCase,然后大部分都进一步继承自SeleniumBastTestCaseWithCompany(它使用@Before 和@After 方法通过Selenium 创建并清理公共测试数据)。
我尝试在SeleniumBaseTestCase 中添加TestWatchman 的子类作为@Rule,覆盖TestWatchman 的failed 方法来截取屏幕截图。问题是@After清理测试数据的方法是在TestWatchman的failed方法被调用之前运行的,所以截图都是清理的最后一步,而不是失败的测试.
稍微看了一下,好像TestWatchman的apply方法只是调用了传递过来的Statement的evaluate方法(唯一暴露的方法),它调用了@After方法,留下了@987654339 @(或任何其他 Rule)据我所知,没有机会在测试的执行和 @After 方法的执行之间插入任何代码。
我还看到了创建自定义 Runner 以更改创建的 Statements 的方法,以便使用自定义 @AfterFailure 注释的方法在 @After 方法之前运行(因此可以在这样的情况下截取屏幕截图一个@AfterFailure 方法),但这依赖于覆盖BlockJUnit4ClassRunner 的withAfters 方法,根据documentation,该方法已被弃用并且将变为私有,它建议改用规则。
我在 SO 上找到了另一个关于 @Rule lifecycle 的答案,听起来这在 JUnit 4.8 中可能根本不可能,但在 JUnit 4.10 中可能是可能的。如果那是正确的那么公平,我想先确认一下。
任何关于我可以实现我想要的优雅且面向未来的方式的想法将不胜感激!
【问题讨论】:
标签: java selenium selenium-webdriver junit junit4