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