Estoy conduciendo un conjunto de pruebas de Selenium (en realidad, selenio respaldado por WebDriver) usando JUnit 4.8.2. Me gustaría que las pruebas tomen automáticamente una captura de pantalla del navegador tan pronto como la prueba falle una afirmación. Todas las pruebas heredan de SeleniumBaseTestCase
, y la mayoría hereda de SeleniumBastTestCaseWithCompany
(que usa los métodos @Before
y @After
para crear y luego limpiar los datos de prueba comunes a través de Selenium).¿Cómo puedo hacer que JUnit 4.8 ejecute código después de una prueba fallida, pero antes de cualquier método @After?
he intentado añadir una subclase de TestWatchman
como @Rule
en SeleniumBaseTestCase
, anulando TestWatchman
's failed
método para tomar la captura de pantalla. El problema es que los métodos @After
que limpian los datos de prueba se están ejecutando antes de que se llame al TestWatchman
, failed
, por lo que las capturas de pantalla son el último paso de la limpieza, no la prueba que falló.
buscando en él un poco, parece que TestWatchman
's apply
método sólo llama a la pasaron Statement
' s evalúan método (el único método expuesto), que llama a los métodos @After
, dejando TestWatchman
(o cualquier otra Rule
) ninguna posibilidad para insertar cualquier código entre la ejecución de la prueba y de los métodos @After
, hasta donde yo sé.
También he visto enfoques que crean una costumbre Runner
para alterar las Statement
s creados por lo que los métodos anotados con la costumbre @AfterFailure
se ejecutan antes @After
métodos (por lo que la pantalla se puede tomar en un procedimiento de este tipo @AfterFailure
), pero esto se basa en la anulación del método BlockJUnit4ClassRunner
withAfters
, que está en desuso y se convertirá en privado, de acuerdo con documentation, que sugiere el uso de Reglas.
He encontrado otra respuesta en SO sobre el @Rule lifecycle que hace que suene como esto simplemente no podría ser posible en JUnit 4.8, pero puede ser posible en JUnit 4.10. Si eso es correcto, entonces es justo, me gustaría confirmarlo primero.
¡Cualquier idea sobre una forma elegante y preparada para el futuro en la que pueda lograr lo que deseo sería muy apreciada!
Sí, creo que actualizar JUnit es el camino a seguir, no puedo ver una solución particularmente satisfactoria en 4.8.2. Tengo un TestWatcher protegido en 'SeleniumBaseTestCase' para tomar capturas de pantalla, y una RuleChain con eso como única regla. Luego, en 'SeleniumBaseTestCaseWithCompany' tengo una ExternalResource para crear/eliminar la compañía, y superviso el RuleChain de la superclase ordenando tanto la captura de pantalla como la regla de creación/eliminación. Parece que funciona bien, gracias. – Rowan
Solo una nota. En 4.11, podrá especificar @Rule en un método, por lo que puede anular ese método en lugar de sombrear un campo. Pero 4.11 aún no ha sido lanzado. –
Ah, es bueno saberlo: seguir la variable era lo único que me inquietaba ... – Rowan