TestNG: preguntas de la entrevista

TestNG: preguntas de la entrevista
MIN
07 Jun 2024

TestNG es uno de los marcos de pruebas más utilizados tanto para pruebas unitarias como automatizadas. En esta guía hemos reunido algunas de las preguntas más frecuentes y las respuestas a las entrevistas, tanto para los recién llegados al campo como para los más experimentados.

Pregunta 1. ¿Qué es TestNG?

Respuesta: TestNG (NG como Next Generation) es un marco de pruebas que puede integrarse con Selenium o con cualquier otra herramienta de automatización para proporcionar múltiples capacidades, como aserciones, informes, ejecución paralela de pruebas, etc.

Pregunta 2. ¿Cuáles son algunas ventajas de TestNG?

R: Las ventajas de TestNG son:

  1. TestNG proporciona varias afirmaciones (aserciones) que ayudan a comprobar los resultados esperados y los reales.
  2. Proporciona la ejecución paralela de los métodos de prueba.
  3. En TestNG podemos definir la dependencia de un método de prueba respecto a los demás.
  4. Podemos asignar prioridad a los métodos de prueba en Selenium.
  5. Permite agrupar los métodos de ensayo en grupos de ensayo.
  6. Permite realizar pruebas basadas en datos utilizando la anotación @DataProvider.
  7. Tiene soporte inherente para informes.
  8. Admite la parametrización de casos de prueba mediante la anotación @Parameters.

Pregunta 3. ¿En qué se diferencia TestNG de Selenium WebDriver?

R: Selenium es una herramienta de automatización que podemos utilizar para automatizar aplicaciones web. Para añadir capacidades de prueba a las suites de automatización de pruebas, Selenium está interconectado con TestNG. Usando TestNG, podemos tener diferentes características en nuestra suite de automatización, como diferentes tipos de aserciones, informes, ejecución paralela, parametrización, etc.

En resumen, para realizar pruebas de automatización, Selenium ayuda con la «automatización» y TestNG ayuda con las capacidades de «prueba».

Pregunta 4. ¿Para qué sirve el archivo testng.xml?

R: El archivo testng.xml se utiliza para configurar todo el conjunto de pruebas. En el archivo testng.xml, podemos crear un conjunto de pruebas, crear grupos de pruebas, marcar pruebas para su ejecución en paralelo, añadir oyentes y pasar parámetros a los guiones de prueba. También podemos utilizar este archivo testng.xml para ejecutar el conjunto de pruebas desde la línea de comandos/terminal o Jenkins.

Pregunta 5. ¿Cómo podemos agrupar los casos de prueba como casos de prueba independientes para la suite de sanidad, la suite de regresión, etc.?

R: Utilizando el atributo groups en TestNG, podemos asignar métodos de prueba a diferentes grupos.

//Testovacia metóda patriaca len do sanity suite

@Test(groups = {"sanitySuite"})

public void testMethod1() {

  //Testovacia logika

}

//Testovacia metóda patriaca do sady sanity aj regresnej sady

@Test(groups = {"sanitySuite", "regressionSuite"})

public void testMethod2() {

  //Testovacia logika

}

Preguntas 6. ¿Cómo podemos excluir un método de prueba de la ejecución mediante el archivo testng.xml?

R: Utilizando la etiqueta de exclusión en el archivo testng.xml, podemos excluir de la ejecución un método de prueba concreto.

<suite name="Test Suite" verbose="1">

   <test name="TestName">

      <classes>

         <class name="TestClassName">

            <methods>

               <exclude name="testMethodToBeExcluded"/>

            </methods>

         </class>      

      </classes>

   </test>

</suite>

Preguntas 7. ¿Cuáles son algunas de las anotaciones de TestNG más utilizadas?

Respuesta: Las anotaciones TestNG más utilizadas son:

  • @Prueba – la anotación @Prueba identifica al método como método de Prueba.
  • @AntesDeSuite – El método de anotación sólo se ejecuta una vez antes de que se ejecuten todas las pruebas de este conjunto.
  • @DespuésDeLaSuite – El método de anotación sólo se ejecutará una vez después de que se hayan ejecutado todas las pruebas de esta suite.
  • @AntesDeClase – El método anotado se ejecuta sólo una vez antes de llamar al primer método de prueba de la clase actual.
  • @AfterClass – El método anotado se ejecuta sólo una vez después de que se hayan ejecutado todos los métodos de prueba de la clase actual.
  • @AntesDePrueba – El método anotado se ejecuta antes de que se ejecute cualquier método de prueba perteneciente a clases dentro de la etiqueta.
  • @AfterTest – El método anotado se ejecuta después de que se ejecuten todos los métodos de prueba pertenecientes a las clases dentro de la etiqueta.
  • @AntesDeMétodo – El método anotado se ejecuta antes de cada método de prueba anotado con @Prueba.
  • @AfterMethod – El método anotado se ejecuta después de cada método de prueba anotado con @Prueba.
  • @DataProvider – La anotación @DataProvider se utiliza para pasar datos de prueba al método de prueba. El método de prueba se activa por el número de filas de datos que pasan por el método del proveedor de datos.

Pregunta 8. ¿Cuál es el orden de ejecución del método de prueba en función de las distintas anotaciones?

Respuesta: Los métodos de prueba en TestNG se ejecutan en el orden Suite->Prueba->Clase->Método combinado con el orden Antes de anotaciones->Prueba de anotaciones->Después de anotaciones. Por tanto, el orden de ejecución es el siguiente

@BeforeSuite

@AntesDeLaPrueba

@AntesClase

@MétodoAnterior

@Prueba

@MétodoDespués

@AfterClass

@AfterTest

@AfterSuite

Pregunta 9. ¿Cuáles son algunas de las afirmaciones comunes que proporciona TestNG?

Respuesta Algunas de las afirmaciones habituales de TestNG son:

  1. assertEquals(String real, String esperado, String mensaje) y otros tipos de datos sobrecargados en el parámetro
  2. assertNotEquals(double data1, double data2, String message) y otros tipos de datos sobrecargados en el parámetro
  3. assertFalse(condición booleana, mensaje de cadena)
  4. assertTrue(condición booleana, mensaje de cadena)
  5. assertNotNull(Objeto objeto)
  6. fail(condición booleana, mensaje de cadena)
  7. true(Mensaje de cadena)

Pregunta 10. ¿Cómo podemos desactivar o impedir que se ejecute un caso de prueba?

Respuesta: Si establecemos el atributo «enabled» en false, podemos impedir que se ejecute el método de prueba.

//V prípade testovacej metódy

@Test(enabled = false)

public void testMethod1() {

  //Testovacia logika

}

//V prípade testovacej metódy patriacej do skupiny

@Test(groups = {"NegativeTests"}, enabled = false)

public void testMethod2() {

  //Testovacia logika

}

Pregunta 11. ¿Cómo podemos utilizar TestNG para hacer que un método de prueba dependa de otros?

R: Utilizando el parámetro dependsOnMethods en la anotación @Test en TestNG, podemos hacer que un método de prueba se ejecute sólo después de que el método de prueba dependiente se haya ejecutado correctamente.

@Prueba(dependeDeMétodos = { «prePruebas» })

Pregunta 12. ¿Cómo podemos establecer la prioridad de los casos de prueba en TestNG?

R: Podemos definir la prioridad de los casos de prueba utilizando el parámetro «prioridad» en la anotación @Test. Las pruebas con valores de prioridad más bajos se realizarán primero. Ejemplo:

@Prueba(prioridad=1)

Pregunta 13. ¿Cuál es la prioridad por defecto de los casos de prueba en TestNG?

R: La prioridad de prueba por defecto, si no se especifica, es un valor entero de 0. Así, si tenemos un caso de prueba con prioridad 1 y otro sin prioridad, se ejecutará primero la prueba sin ningún valor de prioridad (ya que el valor por defecto será 0 y se ejecutarán primero las pruebas con menor prioridad).

Pregunta 14. ¿Cómo podemos ejecutar un método de prueba varias veces en un ciclo (sin utilizar ningún proveedor de datos)?

R: Si utilizas el parámetro invocationCount y estableces su valor en un número entero, el método de prueba se ejecutará n veces en un ciclo.

@Test(invocationCount = 10)

public void invocationCountTest(){

   //Testovacia logika

}

Preguntas 15. ¿Qué es threadPoolSize? ¿Cómo podemos utilizarlo?

Respuesta: El atributo threadPoolSize especifica el número de hilos a asignar al método de prueba. Se utiliza junto con el atributo invocationCount. El número de hilos se divide por el número de iteraciones del método de prueba especificado en el atributo invocationCount.

@Test(threadPoolSize = 5, invocationCount = 10)

public void threadPoolTest(){

   //Testovacia logika

}

Pregunta 16. ¿Cuál es la diferencia entre aserción suave y aserción dura en TestNG?

Respuesta: Esta es una de las preguntas más frecuentes en una entrevista de TestNG. Las aserciones suaves (SoftAssert) nos permiten tener múltiples aserciones dentro de un método de prueba, incluso si una aserción falla, el método de prueba sigue ejecutando el resto de la prueba. El resultado de todas las afirmaciones puede resumirse al final utilizando el método softAssert.assertAll().

@Test

public void softAssertionTest(){

   SoftAssert softAssert= new SoftAssert();

   //Assertion failing

   softAssert.fail();

   System.out.println("Failing");

   //Assertion passing

   softAssert.assertEquals(1, 1);

   System.out.println("Passing");

   //Collates test results and marks them pass or fail

   softAssert.assertAll();

}

Aquí, aunque falle la primera aserción, la prueba continuará su ejecución e imprimirá un mensaje bajo la segunda aserción.

Las afirmaciones duras, por otro lado, son las afirmaciones habituales que proporciona TestNG. En el caso de una afirmación dura, ante cualquier fallo, se detendrá la ejecución de la prueba, impidiendo así que se realicen más pasos del método de prueba.

Pregunta 17. ¿Cómo suspender la prueba en el testNG si no se realiza en el tiempo especificado?

Respuesta: Podemos utilizar el atributo timeOut de la anotación @Test. El valor asignado a este atributo timeOut actuará como límite superior. Si la prueba no se ejecuta dentro de este plazo, fracasará, salvo que se agote el tiempo de espera.

@Test(timeOut = 1000)

public void timeOutTest() throws InterruptedException {

   //Sleep for 2sec so that test will fail

   Thread.sleep(2000);

   System.out.println("Will throw Timeout exception!");

}

Pregunta 18. ¿Cómo podemos omitir condicionalmente un caso de prueba?

R: Podemos saltarnos condicionalmente un caso de prueba utilizando la función SaltarExcepción. Cuando se lanza una skipException, el método de prueba se marca como omitido en el informe de ejecución de la prueba y no se ejecuta ninguna sentencia después de lanzar la excepción.

@Test

public void testMethod(){

  if(conditionToCheckForSkippingTest)

 throw new SkipException("Skipping the test");

  //test logic

}

Pregunta 19. ¿Cómo podemos asegurarnos de que un método de prueba se ejecute incluso si los métodos de prueba o grupos de los que depende fallan o se omiten?

R: Utilizando el atributo «alwaysRun» de la anotación @Test, podemos asegurarnos de que el método de prueba se ejecuta incluso si los métodos de prueba o grupos de los que depende fallan o se omiten.

@Test

public void parentTest() { 

  Assert.fail("Failed test");

}

@Test(dependsOnMethods={"parentTest"}, alwaysRun=true) 

public void dependentTest() { 

  System.out.println("Running even if parent test failed");

}

Aquí, aunque la prueba padre haya fallado, la prueba dependiente no se omitirá, sino que se ejecutará debido a «alwaysRun=true». Si eliminamos el atributo «alwaysRun=true» de @Test, el informe mostrará un fallo y una prueba omitida sin intentar ejecutar el método dependentTest.

Pregunta 20. ¿Cómo podemos pasar un parámetro de prueba a un script utilizando TestNG?

R: Utilizando la anotación @Parameter y la etiqueta «parameter» en testng.xml, podemos pasar parámetros a los scripts de prueba.

Muestra testng.xml:

<suite name="sampleTestSuite">

   <test name="sampleTest">   

      <parameter name="sampleParamName" value="sampleParamValue"/>

      <classes>

         <class name="TestFile" />

      </classes>      

   </test>

</suite>

Ukážka testovacieho skriptu –

public class TestFile {

   @Test

   @Parameters("sampleParamName")

   public void parameterTest(String paramValue) {

      System.out.println("Value of sampleParamName is - " + sampleParamName);

   }

Pregunta 21. ¿Cómo podemos crear un marco basado en datos utilizando TestNG?

R: Utilizando @DataProvider, podemos crear un marco dirigido por datos en el que los datos se pasan al método de prueba apropiado y se ejecutan múltiples iteraciones de la prueba para diferentes valores de los datos de prueba pasados desde el método @DataProvider. El método anotado por la anotación @DataProvider devuelve una matriz 2D del objeto.

//Data provider returning 2D array of 3*2 matrix

 @DataProvider(name = "dataProvider1")

   public Object[][] dataProviderMethod1() {

      return new Object[][] {{"kuldeep","rana"}, {"k1","r1"},{"k2","r2"}};

   }

   //This method is bound to the above data provider returning 2D array of 3*2 matrix

   //The test case will run 3 times with different set of values

   @Test(dataProvider = "dataProvider1")

   public void sampleTest(String s1, String s2) {

      System.out.println(s1 + " " + s2);

   }

Pregunta 22. ¿Para qué sirve la anotación @Listener en TestNG?

Respuesta: TestNG nos proporciona diferentes tipos de escuchadores con los que podemos realizar una acción cuando se dispara un evento. Normalmente, los listeners de TestNG se utilizan para configurar los informes y el registro. Uno de los escuchadores más utilizados en testNG es la interfaz ITestListener. Tiene métodos como onTestSuccess, onTestFailure, onTestSkipped, etc. Tenemos que implementar esta interfaz creando nuestra propia clase oyente. A continuación, mediante la anotación @Listener, podemos especificar que nuestra clase listener personalizada debe utilizarse para una clase de prueba concreta.

@Listeners(PackageName.CustomizedListenerClassName.class)

public class TestClass { 

    WebDriver driver= new FirefoxDriver();@Test 

    public void testMethod(){

    //testovacia logika

    }

}

Pregunta 23. ¿Para qué sirve la anotación @Factory en TestNG?

Respuesta: La anotación @Factory ayuda en la ejecución dinámica de los casos de prueba. Utilizando la anotación @Factory, podemos pasar parámetros a toda la clase de prueba en tiempo de ejecución. Los parámetros pasados pueden ser utilizados por uno o varios métodos de prueba de esta clase.

Por ejemplo, hay dos clases TestClass y TestFactory. Gracias a la anotación @Factory, los métodos de prueba de la clase TestClass se ejecutan dos veces con las entradas «k1» y «k2»

public class TestClass{

    private String str;

    //Constructor

    public TestClass(String str) {

        this.str = str;

    }

    @Test

    public void TestMethod() {

        System.out.println(str);

    }

}

public class TestFactory{

    //The test methods in class TestClass will run twice with data "k1" and "k2"

    @Factory

    public Object[] factoryMethod() {

        return new Object[] { new TestClass("K1"), new TestClass("k2") };

    }

}

Pregunta 24. ¿Cuál es la diferencia entre la anotación @Factory y @DataProvider?

Contesta: El método @Factory crea una instancia de una clase de prueba y ejecuta todos los métodos de prueba de esa clase con un conjunto diferente de datos.

Mientras que @DataProvider se vincula a métodos de prueba individuales y ejecuta métodos específicos varias veces.

Pregunta 25. ¿Cómo podemos utilizar TestNG para ejecutar casos de prueba en paralelo?

Respuesta: Para ejecutar pruebas en paralelo, sólo tienes que añadir estos dos pares clave-valor a la etiqueta suite del archivo testng.xml

  • parallel=»{métodos/pruebas/clases}»
  • thread-count=»{número de hilos que quieres ejecutar al mismo tiempo}».

<suite name=»ITtester» parallel=»métodos» thread-count=»5″>

Con esto concluye nuestra exhaustiva lista de preguntas para las entrevistas de TestNG. Si quieres saber más sobre TestNG, también puedes consultar nuestro completo – Tutorial TestNG.