Diferencia entre revisiones de «Configuración de ejecución selectiva de tests»

De Dos Ideas.
Saltar a: navegación, buscar
(Uso a nivel método)
 
(No se muestran 18 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 +
Estas son las maneras que encontramos para poder realizar corridas selectivas de los test de [[JUnit]].
 +
 +
== Utilizando Junit ==
 +
 
Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.
 
Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de [[JUnit]]. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto [[JUnit]] trata los test con las hipótesis negativas como ignorados.
  
Línea 42: Línea 46:
 
     </macrodef>
 
     </macrodef>
 
</target>
 
</target>
 +
</code>
 +
 +
 +
== Utilizando Junit con Spring ==
 +
 +
[[Spring Test]] proporciona la anotación @IfProfileValue que indica a [[JUnit]] si la clase o el test esta en condiciones de ser ejecutado según la configuración o el entorno. La implementación por defecto es la clase SystemProfileValueSource que obtiene propiedades del sistema.
 +
 +
En nuestro ejemplo creamos nuestra propia implementación de la clase SystemProfileValueSource para poder tener un valor por defecto en el entorno de desarrollo  y tener asignadas las variables en nuestro entorno de [[Integracion Continua]]. Para indicar que queremos utiliza nuestra propia implementación se utiliza la anotación @ProfileValueSourceConfiguration.
 +
 +
=== Implementación de ProfileValueSource ===
 +
 +
<code java>
 +
public class DosIdeasSystemProfileValueSource implements ProfileValueSource {
 +
 +
    private static final DosIdeasSystemProfileValueSource INSTANCE = new DosIdeasSystemProfileValueSource();
 +
 +
    public static final DosIdeasSystemProfileValueSource getInstance() {
 +
        return INSTANCE;
 +
    }
 +
 +
    public DosIdeasSystemProfileValueSource() {
 +
    }
 +
 +
    public String get(String key) {
 +
        Assert.hasText(key, "'name' debe tener valor");
 +
       
 +
        String valorDefault = "SI";
 +
       
 +
        if (System.getProperty(key) != null) {
 +
            valorDefault = System.getProperty(key);
 +
        }
 +
               
 +
        return valorDefault;
 +
    }
 +
}
 +
</code>
 +
 +
=== Uso a nivel método ===
 +
 +
Al correr el test se ejecutara el método prueba_1. En el caso de setear la variable de entorno correrIntegracion=NO solo se ejecuta el método prueba_2.
 +
 +
<code java>
 +
@ProfileValueSourceConfiguration(DosIdeasSystemProfileValueSource.class)
 +
public class AlumnoBoTest {
 +
 +
    @Test
 +
    @IfProfileValue(name="correrIntegracion", value="SI")
 +
    Public void prueba_1() {
 +
      System.out.println("prueba_1");
 +
    }
 +
 +
    @Test
 +
    @IfProfileValue(name="correrIntegracion", value="NO")
 +
    Public void prueba_2() {
 +
      System.out.println("prueba_1");
 +
    }
 +
}
 +
 +
</code>
 +
 +
=== Uso a nivel clase ===
 +
 +
Al correr el test se ejecutan los dos métodos de la clase. En el caso de setear la variable de entorno correrIntegracion=NO no se ejecuta ningun método.
 +
 +
<code java>
 +
@ProfileValueSourceConfiguration(DosIdeasSystemProfileValueSource.class)
 +
@IfProfileValue(name="correrIntegracion", value="SI")
 +
public class AlumnoBoTest {
 +
 +
  @Test
 +
  Public void prueba_1() {
 +
    System.out.println("prueba_1");
 +
  }
 +
 +
  @Test
 +
  Public void prueba_2() {
 +
    System.out.println("prueba_1");
 +
  }
 +
 +
}
 
</code>
 
</code>

Revisión actual del 17:02 27 jul 2011

Estas son las maneras que encontramos para poder realizar corridas selectivas de los test de JUnit.

Utilizando Junit

Para poder correr selectivamente los test de integración de nuestras aplicaciones utilizamos la funcionalidad provista por la clase Assume de JUnit. La clase Assume contiene métodos útiles para afirmar las hipótesis sobre las condiciones en las que los resultados de los test son significativos. Un supuesto negativo no significa que el código está roto, pero si que los resultados de los test no proporciona ninguna información útil. Por defecto JUnit trata los test con las hipótesis negativas como ignorados.

Para el caso de proyectos creados con NetBeans compilados con Ant, podemos indicar si queremos o no correr determinados test usando ciertas propiedades.

Propiedad:

-Dtest-sys-prop.correrIntegracion=NO

@BeforeClass public static void setUpOnce() throws Throwable {

       System.out.println("Se usarán los test de integración [SI/NO]: " + System.getProperty("correrIntegracion"));
       Assume.assumeTrue(System.getProperty("correrIntegracion") == null
               ? true : System.getProperty("correrIntegracion").matches("SI"));

}

Como podemos ver en el ejemplo, por linea de comando se indica la propiedad "test-sys-prop.correrIntegracion", pero en el test se consulta por la propiedad “correrIntegracion”, esto se debe a que por defecto la tarea Ant creada por Netbeans para correr los test de JUnit tiene la propiedad “fork” en true. En esta tarea podemos ver el tag "syspropertyset", el cual indica que todas las propiedades que tengan el prefijo "test-sys-prop." se pasen sin este prefijo al proceso iniciado por el fork para ejecutar la clase de test.

<target name="-init-macrodef-junit">

   <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/2">
       <attribute name="includes" default="**/*Test.java"/>
       <sequential>
           <junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
               .

. .

               <syspropertyset>
                   <propertyref prefix="test-sys-prop."/>
                   <mapper type="glob" from="test-sys-prop.*" to="*"/>
               </syspropertyset>
               .

. .

           </junit>

. . .

       </sequential>
   </macrodef>

</target>


Utilizando Junit con Spring

Spring Test proporciona la anotación @IfProfileValue que indica a JUnit si la clase o el test esta en condiciones de ser ejecutado según la configuración o el entorno. La implementación por defecto es la clase SystemProfileValueSource que obtiene propiedades del sistema.

En nuestro ejemplo creamos nuestra propia implementación de la clase SystemProfileValueSource para poder tener un valor por defecto en el entorno de desarrollo y tener asignadas las variables en nuestro entorno de Integracion Continua. Para indicar que queremos utiliza nuestra propia implementación se utiliza la anotación @ProfileValueSourceConfiguration.

Implementación de ProfileValueSource

public class DosIdeasSystemProfileValueSource implements ProfileValueSource {

   private static final DosIdeasSystemProfileValueSource INSTANCE = new DosIdeasSystemProfileValueSource();
   public static final DosIdeasSystemProfileValueSource getInstance() {
       return INSTANCE;
   }
   public DosIdeasSystemProfileValueSource() {
   }
   public String get(String key) {
       Assert.hasText(key, "'name' debe tener valor");
       
       String valorDefault = "SI";
       
       if (System.getProperty(key) != null) {
           valorDefault = System.getProperty(key);
       }
               
       return valorDefault;
   }

}

Uso a nivel método

Al correr el test se ejecutara el método prueba_1. En el caso de setear la variable de entorno correrIntegracion=NO solo se ejecuta el método prueba_2.

@ProfileValueSourceConfiguration(DosIdeasSystemProfileValueSource.class) public class AlumnoBoTest {

   @Test
   @IfProfileValue(name="correrIntegracion", value="SI")
   Public void prueba_1() {
     System.out.println("prueba_1");
   }
   @Test
   @IfProfileValue(name="correrIntegracion", value="NO")
   Public void prueba_2() {
     System.out.println("prueba_1");
   }

}

Uso a nivel clase

Al correr el test se ejecutan los dos métodos de la clase. En el caso de setear la variable de entorno correrIntegracion=NO no se ejecuta ningun método.

@ProfileValueSourceConfiguration(DosIdeasSystemProfileValueSource.class) @IfProfileValue(name="correrIntegracion", value="SI") public class AlumnoBoTest {

  @Test
  Public void prueba_1() {
    System.out.println("prueba_1");
  }
  @Test
  Public void prueba_2() {
    System.out.println("prueba_1");
  }

}