Я провожу серию тестов Selenium (на самом деле Sedenium с поддержкой WebDriver), используя JUnit 4.8.2. Я бы хотел, чтобы тесты автоматически снимали скриншот браузера, как только тест не подтвердил утверждение. Все тесты наследуют от SeleniumBaseTestCase
, а большинство затем наследует от SeleniumBastTestCaseWithCompany
(который использует методы @Before
и @After
для создания, а затем очистки общих тестовых данных через Selenium).
Я попытался добавить подкласс TestWatchman
в качестве @Rule
в SeleniumBaseTestCase
, переопределяя метод TestWatchman
failed
, чтобы сделать снимок экрана. Проблема в том, что методы @After
, очищающие тестовые данные, запускаются до того, как вызывается метод TestWatchman
failed
, поэтому скриншоты - это последний шаг очистки, а не те, которые не выполнялись.
В нем мало что кажется, что метод TestWatchman
apply
просто вызывает переданный метод оценки Statement
(единственный открытый метод), который вызывает методы @After
, оставляя TestWatchman
(или любой other Rule
) нет возможности вставить какой-либо код между выполнением теста и методами @After
, насколько я могу судить.
Я также видел подходы, которые создают пользовательский Runner
, чтобы изменить созданный Statement
так, чтобы методы, аннотированные с помощью пользовательского @AfterFailure
, выполнялись до методов @After
(так что скриншот можно взять в таком @AfterFailure
), но это зависит от переопределения метода BlockJUnit4ClassRunner
withAfters
, который устарел и из-за того, что стал закрытым, согласно documentation, который предлагает использовать Правила вместо этого.
Я нашел еще один ответ на SO о жизненном цикле @Rule, который заставляет его звучать так, как это может быть просто невозможно в JUnit 4.8, но может быть возможно в JUnit 4.10. Если бы это правильно, то справедливое, я бы просто хотел подтвердить это в первую очередь.
Любые мысли об элегантном и перспективном способе, в котором я могу достичь того, что я хочу, будут высоко оценены!