unit-testing - tutorial - pruebas unitarias php
Junit: prueba de integraciĆ³n dividida y pruebas unitarias (6)
He heredado una carga de la prueba de Junit, pero estas pruebas (aparte de la mayoría no funciona) son una mezcla de prueba de unidad real y pruebas de integración (que requieren sistemas externos, db, etc.).
Así que estoy tratando de pensar en una forma de separarlos, de modo que pueda ejecutar la prueba unitaria de manera rápida y sencilla y las pruebas de integración posteriores.
Las opciones son ..
Dividirlos en directorios separados.
Vaya a Junit4 (desde la v3) y anote las clases para separarlas.
Use una convención de nomenclatura de archivos para indicar qué clase es, es decir, AdapterATest y AdapterAIntergrationTest.
3 tiene el problema de que Eclipse tiene la opción de "Ejecutar todas las pruebas en el proyecto / paquete o carpeta seleccionados". Por lo tanto, sería muy difícil ejecutar las pruebas de integración.
2: corre el riesgo de que los desarrolladores comiencen a escribir pruebas de integración en clases de prueba unitaria y se vuelve complicado.
1: Parece la mejor solución, pero mi intuición dice que debe haber una mejor solución.
Así que esa es mi pregunta, ¿cómo se rompen las pruebas de integración y las pruebas unitarias adecuadas?
Actualmente uso directorios separados debido a la política de la organización (y al legado de Junit 3), pero estoy buscando la transición a las anotaciones ahora que estoy en Junit 4.
No me preocuparía demasiado que los desarrolladores pongan pruebas de integración en las clases de prueba de la unidad; si es necesario, agregue una regla en sus estándares de codificación.
Me interesa saber qué tipo de otras soluciones podrían existir aparte de las anotaciones o separar físicamente las clases.
El uso de la anotación de primavera IfProfileValue permite lograr esto sin necesidad de un complemento maven o la configuración.
Anote las clases o métodos de prueba de integración utilizando IfProfileValue
import org.springframework.test.annotation.IfProfileValue;
@IfProfileValue(name="test-groups", value="integration")
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
Para ejecutar usando solo pruebas unitarias:
mvn clean test
Para ejecutar usando prueba de integración y pruebas unitarias:
mvn clean test -Dtest-groups=integration
Además, "Ejecutar todas las pruebas" en un IDE solo ejecutaría la prueba unitaria. Agregar -Dtest-groups=integration
a los argumentos de VM para ejecutar pruebas de integración y de unidades.
Me movería a Junit4 solo por tenerlo :)
Puede separarlos en diferentes suites de prueba. No sé cómo están organizados en Junit3, pero debería ser fácil en Junit4 solo construir suites de prueba y poner todas las pruebas de unidades reales en una de ellas y luego usar una segunda suite para las pruebas de integración.
Ahora defina una configuración de ejecución para ambas suites en eclipse y podrá ejecutar fácilmente una única suite. Estas suites también podrían lanzarse desde un proceso automatizado que le permita ejecutar las pruebas unitarias cada vez que cambie la fuente y quizás las pruebas de integración (si son realmente grandes) solo una vez al día o una vez por hora.
No hay una respuesta correcta. Como ya has explicado, hay varias maneras de hacerlo que funcionarán. He hecho tanto el esquema de nombres de archivos como la división de cosas en diferentes directorios.
Parece que dividirlo en diferentes directorios podría funcionar mejor para ti, y eso me parece un poco más claro, así que me inclino por eso.
No creo que intente las anotaciones porque me parece más preciso. ¿Realmente desea que estos dos tipos de pruebas se mezclen en el mismo archivo? Yo no lo haría
Puede dividirlos muy fácilmente utilizando las categorías JUnit y Maven.
Esto se muestra muy, muy brevemente a continuación mediante la división de la unidad y las pruebas de integración.
Definir una interfaz de marcador
El primer paso para agrupar una prueba usando categorías es crear una interfaz de marcador.Esta interfaz se usará para marcar todas las pruebas que desea que se ejecuten como pruebas de integración.
public interface IntegrationTest {}
Marque sus clases de prueba
Agregue la anotación de categoría a la parte superior de su clase de prueba. Toma el nombre de tu nueva interfaz.
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
Configurar pruebas de unidad Maven
La belleza de esta solución es que nada realmente cambia para el lado de la prueba de unidad.Simplemente agregamos alguna configuración al plugin maven surefire para que ignore cualquier prueba de integración.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
</configuration>
</plugin>
Cuando realice una prueba de limpieza de mvn, solo se ejecutarán las pruebas de la unidad sin marcar.
Configurar las pruebas de integración de Maven
De nuevo, la configuración para esto es muy simple.Para ejecutar solo las pruebas de integración, usa esto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<groups>com.test.annotation.type.IntegrationTest</groups>
</configuration>
</plugin>
Si ajusta esto en un perfil con id IT
, puede ejecutar solo las pruebas rápidas usando mvn clean install
. Para ejecutar solo las pruebas de integración / lentas, use mvn clean install -P IT
.
Pero lo más frecuente es que quiera ejecutar las pruebas rápidas de manera predeterminada y todas las pruebas con -P IT
. Si ese es el caso, entonces debes usar un truco:
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn''t overwrite, so I''m using an interface here which no one will ever use -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Como puede ver, excluyo las pruebas anotadas con java.io.Serializable
. Esto es necesario porque el perfil heredará la configuración predeterminada del complemento Surefire, por lo que incluso si dice <excludedGroups/>
com.test.annotation.type.IntegrationTest
<excludedGroups></excludedGroups>
com.test.annotation.type.IntegrationTest
<excludedGroups></excludedGroups>
com.test.annotation.type.IntegrationTest
<excludedGroups></excludedGroups>
, se com.test.annotation.type.IntegrationTest
el valor com.test.annotation.type.IntegrationTest
.
Tampoco puedes usar none
ya que tiene que ser una interfaz en el classpath (Maven comprobará esto).
Notas:
- La dependencia de
surefire-junit47
solo es necesaria cuando Maven no cambia automáticamente alsurefire-junit47
JUnit 4. El uso del elementogroups
oexcludedGroups
debe desencadenar el cambio. Mira aquí . - La mayoría del código anterior fue tomado de la documentación del plugin Maven Failsafe. Consulte la sección "Uso de categorías JUnit" en esta página .
- Durante mis pruebas, descubrí que esto incluso funciona cuando usas anotaciones
@RunWith()
para ejecutar suites o pruebas basadas en Spring.
Usamos Maven Surefire Plugin para ejecutar pruebas unitarias y Maven Failsafe Plugin para ejecutar pruebas de integración. Las pruebas unitarias siguen los convenios de nomenclatura **/Test*.java **/*Test.java **/*TestCase.java
, pruebas de integración - **/IT*.java **/*IT.java **/*ITCase.java
. Entonces, en realidad es su opción número tres.
En un par de proyectos usamos TestNG y definimos diferentes grupos de prueba para pruebas de integración / unidad, pero probablemente esto no sea adecuado para usted.