es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TestWatcher API, junit5, Allure: cómo tomar un navegador cuando @AfterEach ocurre antes de testFailed

Solo he comenzado a trabajar con Junit5/Selenium y Allure.

Como todos ustedes y yo sabemos, las API de TestWatcher solo funcionan después de las anotaciones de JUnit, como @AfterAll/Each, por ejemplo.

Pero mi problema es que necesito tomar una captura de pantalla cuando una prueba falla.
Sí, puedo agregar el cierre del navegador a TestWatcher:

@Override
public void testFailed(ExtensionContext extensionContext, Throwable throwable) {
    Allure.addAttachment("Attachment",
        new ByteArrayInputStream(((TakesScreenshot) browser.getDriver()).getScreenshotAs(OutputType.BYTES)));
    if (getBrowser().isBrowserAlive()) {
        Browser.getInstance().close();
    }
}

pero no me gusta esto, porque necesito agregar el cierre del navegador a cada método de TestWatcher. Y como resultado, se agregará un adjunto al cuerpo de la prueba en allure.

Pero quiero agregar el cierre del navegador a:

@AfterEach
void tearDown() {}

Pregunta: ¿cómo puedo enviar un controlador desde la clase BaseTest a TestWatcher (testFailed)?

Encontré un código como este, pero lamentablemente no tengo idea de cómo usarlo porque en la clase de prueba no tengo un controlador:

Object test = extensionContext.getRequiredTestInstance();
Field field = test.getClass().getDeclaredField("driver");
field.setAccessible(true);
WebDriver driver = (WebDriver) field.get(test);
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para enviar el controlador desde la clase BaseTest al método testFailed de TestWatcher, puedes crear un método protegido en la clase BaseTest que devuelva la instancia del controlador y luego llamarlo desde el método testFailed de TestWatcher.

    Aquí está el código actualizado para el método testFailed de TestWatcher:

    @Override
    public void testFailed(ExtensionContext extensionContext, Throwable throwable) throws Exception {
        Allure.addAttachment("Attachment", new ByteArrayInputStream(((TakesScreenshot) getDriver()).getScreenshotAs(OutputType.BYTES)));
        if (getDriver() != null) {
            getDriver().close();
        }
    }
    

    Y en la clase BaseTest, crea un método protegido llamado getDriver() que devuelva la instancia del controlador:

    protected WebDriver driver;
    
    protected WebDriver getDriver() {
        return driver;
    }
    

    Luego, en tu clase de prueba, extiende la clase BaseTest y establece la instancia del driver en tu método @BeforeEach, por ejemplo:

    public class MyTestClass extends BaseTest {
    
        @BeforeEach
        public void setUp() {
            driver = new ChromeDriver();
        }
    
        @Test
        public void myTest() {
            // código de prueba aquí
        }
    
    }
    

    Con este enfoque, el método testFailed de TestWatcher puede acceder a la instancia del driver en la clase BaseTest sin necesidad de que se pase como parámetro.

Comments are closed.