Diferencia entre revisiones de «Tests De JUnit Parametrizados»

De Dos Ideas.
Saltar a: navegación, buscar
(Página creada con 'Hay situaciones en las que debemos correr un tests varias veces pero con diferente juego de datos. Para estos casos JUnit tiene un Runner que permite que escribamos el caso …')
 
(Como funciona)
 
(No se muestran 12 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
Hay situaciones en las que debemos correr un tests varias veces pero con diferente juego de datos. Para estos casos [[JUnit]] tiene un Runner que permite que escribamos el caso de test separado del juego de datos.  
+
Hay situaciones en las que debemos correr un tests varias veces pero con diferente juego de datos. Para estos casos [[JUnit]] tiene el Runner ''org.junit.runners.Parameterized'' que permite que escribamos el caso de test separado del juego de datos.  
 +
 
 +
Los tipos de datos soportados por el momento son String o variables primitivas (eg: int, char, etc)
 +
 
 +
==Ejemplo==
  
 
Supongamos el test de una clase que convierte un número de una base en otra. En lugar de escribir varios métodos @Test, se escribe un sólo método @Test que JUnit correrá con cada juego de datos.  
 
Supongamos el test de una clase que convierte un número de una base en otra. En lugar de escribir varios métodos @Test, se escribe un sólo método @Test que JUnit correrá con cada juego de datos.  
Línea 17: Línea 21:
 
Valores que se eligen para el test:  
 
Valores que se eligen para el test:  
  
 +
{| cellspacing="1" cellpadding="1" border="1" style="width: 313px; height: 124px;"
 +
|-
 +
| Número<br>
 +
| Base&nbsp;Origen<br>
 +
| Base Destino<br>
 +
| Salida<br>
 +
|-
 +
| 10<br>
 +
| 2<br>
 +
| 10<br>
 +
| 2<br>
 +
|-
 +
| 255<br>
 +
| 10<br>
 +
| 16<br>
 +
| FF<br>
 +
|-
 +
| AB<br>
 +
| 16<br>
 +
| 10<br>
 +
| 171<br>
 +
|-
 +
| 255<br>
 +
| 10<br>
 +
| 2<br>
 +
| 11111111<br>
 +
|}
 +
 +
<br>
  
 +
Este sería el test
  
 +
<code java="java">
 +
import static org.junit.Assert.assertEquals;
  
 +
import java.util.Arrays;
 +
import java.util.Collection;
  
 +
import org.junit.Test;
 +
import org.junit.runner.RunWith;
 +
import org.junit.runners.Parameterized;
 +
import org.junit.runners.Parameterized.Parameters;
  
 +
@RunWith(Parameterized.class)
 +
public class CalculadoraSecuenciaTest {
  
{|Número|Base Origen|Base Destino|Resultado|
+
    private String numero;
|-
+
    private int baseOrigen;
|10|2|10|2|
+
    private int baseDestino;
|-
+
    private String resultado;
|255|10|16|FF|
+
   
|-
+
    @Parameters
|AB|16|10|171|
+
    public static Collection<Object[]> data() {
|-
+
        Object[][] data = {
|255|10|2|11111111|}
+
                //Numero        BaseOrigen      BaseDestino    Resultado
 +
                {  "10",          2,              10,          "2"          },
 +
                {  "255",          10,            16,          "FF"          },
 +
                {  "AB",          16,            10,          "171"        },
 +
                {  "255",          10,            2,            "11111111"    }
 +
        };
 +
        return Arrays.asList(data);
 +
    }
 +
   
 +
    public CalculadoraSecuenciaTest(
 +
            String numero, int baseOrigen, int baseDestino, String resultado) {
 +
 
 +
        this.numero = numero;
 +
        this.baseOrigen = baseOrigen;
 +
        this.baseDestino = baseDestino;
 +
        this.resultado = resultado;
 +
    }
 +
   
 +
    @Test
 +
    public void calcular_conNumeroYBases_retornaResultado() {
 +
        String resultadoObtenido = Calculadora.calcular(numero, baseOrigen, baseDestino);
 +
        assertEquals(resultado, resultadoObtenido);
 +
    }
 +
}
 +
</code>
 +
 
 +
=== Como funciona  ===
 +
 
 +
#Se indica a JUnit que utilice el Runner Parameterized con la anotación @RunWith.
 +
##Con este Runner JUnit instanciará la clase de test tantas veces como juego de datos tenga.
 +
#Se define un constructor que recibe los parametros de cada juego de datos.
 +
##Cada vez que el Runner instancia la clase le pasa un nuevo juego de datos por el constructor.
 +
#Se define un metodo con la anotación @Parameters (Por convención lo llamamos "data").
 +
##En este método creamos una matriz en donde cada fila representa a un juego de datos.
 +
##Se debe respetar el orden de columnas con la definición del constructor.
 +
##La matriz se devuelve como una List de Object[].
 +
#Por último, se crea el metodo marcado como @Test.
 +
##Este metodo se ejecutará una vez por cada juego de datos.
 +
##Es posible definir más de un método @Test.
  
=== Ver también ===
+
== Ver también ==
 +
*[[JUnit]]
 +
*[http://junit.org/apidocs/index.html?org/junit/runners/Parameterized.html Javadoc oficial de la clase Parameterized]
 +
*[http://www.dosideas.com/java/743-test-secuencial-con-selenium-y-junit.html Test Secuancial con Selenium y JUnit]
 +
*[[TwiP]]
  
*[[JUnit]]
+
[[Category: JUnit]]

Revisión actual del 16:26 24 mar 2011

Hay situaciones en las que debemos correr un tests varias veces pero con diferente juego de datos. Para estos casos JUnit tiene el Runner org.junit.runners.Parameterized que permite que escribamos el caso de test separado del juego de datos.

Los tipos de datos soportados por el momento son String o variables primitivas (eg: int, char, etc)

Ejemplo

Supongamos el test de una clase que convierte un número de una base en otra. En lugar de escribir varios métodos @Test, se escribe un sólo método @Test que JUnit correrá con cada juego de datos.

Clase a testear:

public class Calculadora {

   ...
   public static String calcular(String numero, int baseOrigen, int baseDestino) {
       ...
       //calcula el resultado
       return resultado;  

}

Valores que se eligen para el test:

Número
Base Origen
Base Destino
Salida
10
2
10
2
255
10
16
FF
AB
16
10
171
255
10
2
11111111


Este sería el test

import static org.junit.Assert.assertEquals;

import java.util.Arrays; import java.util.Collection;

import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class) public class CalculadoraSecuenciaTest {

   private String numero;
   private int baseOrigen;
   private int baseDestino;
   private String resultado;
   
   @Parameters
   public static Collection<Object[]> data() {
       Object[][] data = {
               //Numero        BaseOrigen      BaseDestino     Resultado
               {   "10",           2,              10,           "2"           },
               {   "255",          10,             16,           "FF"          },
               {   "AB",           16,             10,           "171"         },
               {   "255",          10,             2,            "11111111"    }
       };
       return Arrays.asList(data);
   }
   
   public CalculadoraSecuenciaTest(
           String numero, int baseOrigen, int baseDestino, String resultado) {
       this.numero = numero;
       this.baseOrigen = baseOrigen;
       this.baseDestino = baseDestino;
       this.resultado = resultado;
   }
   
   @Test
   public void calcular_conNumeroYBases_retornaResultado() {
       String resultadoObtenido = Calculadora.calcular(numero, baseOrigen, baseDestino);
       assertEquals(resultado, resultadoObtenido);
   }

}

Como funciona

  1. Se indica a JUnit que utilice el Runner Parameterized con la anotación @RunWith.
    1. Con este Runner JUnit instanciará la clase de test tantas veces como juego de datos tenga.
  2. Se define un constructor que recibe los parametros de cada juego de datos.
    1. Cada vez que el Runner instancia la clase le pasa un nuevo juego de datos por el constructor.
  3. Se define un metodo con la anotación @Parameters (Por convención lo llamamos "data").
    1. En este método creamos una matriz en donde cada fila representa a un juego de datos.
    2. Se debe respetar el orden de columnas con la definición del constructor.
    3. La matriz se devuelve como una List de Object[].
  4. Por último, se crea el metodo marcado como @Test.
    1. Este metodo se ejecutará una vez por cada juego de datos.
    2. Es posible definir más de un método @Test.

Ver también