Tests parametrizados con TestNG

En el post anterior vimos cómo podíamos implementar tests parametrizados utilizando JUnit 4. TestNG es un framework similar a JUnit, compartiendo entre ellos casi la totalidad de sus features.

TestNG propone un enfoque un poco diferente a la implementación de tests parametrizados. Me pareció más flexible y prolija, por lo que creo que vale la pena continuar el post anterior con el ejemplo implementado utilizando este framework.

En TestNG, los pasos que debemos seguir para implementar un test parametrizado son los siguientes:

  • Escribir un método anotado con @DataProvider(name = «[nombre]»), donde [nombre] es el nombre por el cual se referenciará a este DataProvider en los métodos de test. Si los juegos de datos tienen más de una variable, deberá retornar un array
    multidimensional. Si es necesario -generalmente lo es-, podría contener además el resultado esperado para cada juego de datos de entrada.
  • Escribir un método anotado con @Test(dataProvider = «[nombre]»), que reciba tantos parámetros como cantidad de datos se tenga en cada item del array que retorna el método anotado con @DataProvider.

No hay necesidad de aislar los tests parametrizados de los tests que no lo son. Se puede inclusive tener varios DataProviders en una misma clase, asociando métodos de tests diferentes a cada uno.

Veamos un ejemplo de la case de test utilizando TestNG (el proyecto está disponible para bajar aquí):

<br />
package com.josearrarte;</p>
<p>import static org.junit.Assert.assertEquals;</p>
<p>import org.testng.annotations.DataProvider;<br />
import org.testng.annotations.Test;</p>
<p>public class ParametrizedTestNGTest {</p>
<p>	@DataProvider(name=&quot;test1&quot;)<br />
	public<br />
Object[][] createData1() {<br />
		return new Object[][] {<br />
				{ DateFormatProvider.OPERATION_TYPE_1, &quot;MMYY&quot; },<br />
				{ DateFormatProvider.OPERATION_TYPE_2, &quot;YYMM&quot; },<br />
				{ DateFormatProvider.OPERATION_TYPE_3, &quot;YYYYMM&quot; } };<br />
	}</p>
<p>	@Test(dataProvider=&quot;test1&quot;)<br />
	public void verifyDateFormats(int operationType, String dateFormat)<br />
		throws Exception {<br />
		DateFormatProvider provider = new DateFormatProvider();</p>
<p>		String result = provider.getDateFormatFor(operationType);<br />
		assertEquals(dateFormat, result);<br />
	}</p>
<p>	@Test(expectedExceptions=IllegalArgumentException.class)<br />
	public void verifyDateFormats_ShouldThrowIllegalArgumentException()<br />
		throws Exception {<br />
		DateFormatProvider provider = new DateFormatProvider();</p>
<p>		provider.getDateFormatFor(-1);<br />
	}<br />
}<br />

Como vemos, la idea es exactamente la misma que en JUnit, pero está mejor implementada. Los tests parametrizados se diferencian mejor, y no es necesario tener miembros de la clase y constructores
comunes para almacenar los datos.

Además, el hecho de separar la creación de los tests (instanciación) con la generación de los juegos de datos (data providers) nos permite tener en una misma clase tests con y sin parámetros.

Etiquetado , . Bookmark the permalink.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *