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