2011-09-23 17 views
10

Fondo rápido: He estado buscando un problema de ejecución de prueba Maven/Surefire durante días, y lo he reducido a un pequeño número de pruebas sospechosas. El comportamiento que estoy viendo es insano. Comienzo con mvn clean test: se ejecutan 250 pruebas, se omite 0. Ahora, muevo la prueba sospechosa al src/test/java y vuelvo a intentarlo: ¡se ejecutan 146 pruebas, se omite 0! La salida de Maven da no pista de que no se están ejecutando otras pruebas, incluso con el indicador -X.Si yo ignoro una clase de prueba en JUnit4, ¿@BeforeClass aún se ejecuta?

Esto me lleva a mi pregunta: ¿la razón por la que llamo la prueba de 'sospechoso' es que toda la clase está decorado con @ignore, por lo que se imagina que ello mis fuentes de prueba debe tener ningún efecto en absoluto . Entonces se me ocurrió que esas clases tienen los métodos @ BeforeClass/@ AfterClass que manage a dummy Zookeeper server. Se ha traducido en un comportamiento inseguro antes, por lo que tenemos las pruebas @Ignored.

Si JUnit ejecuta el código de antes/después pero ignora las pruebas, no tengo idea de lo que podría pasar (pero probablemente sería súper malo). Está sucediendo esto? Se supone que pase esto? Si es así, ¿cómo se supone que decir "como referencia, aquí hay una prueba que debería funcionar pero necesita ser reparada" cuando incluye @BeforeClass/@AfterClass? También de gran interés: ¿qué demonios está haciendo esto con Surefire/Maven, que causa pruebas no relacionadas con caerse de la faz de la tierra?

+0

En mi máquina 'mvn clean test' no ejecuta' @ BeforeClass' en una clase '@ Ignore'. El contador 'Omitido' está aumentando en solo uno independientemente de la cantidad de métodos @Test en la clase @Ignore. (Maven 2.2.1, jUnit 4.9) Debería adjuntar algunos códigos y números de versión. ¿Estás usando un corredor de prueba personalizado? – palacsint

+0

No estoy usando un corredor personalizado. Es Maven 3.0.algo, JUnit 4.8.1. – Coderer

+0

¿Cuál es el número de versión de su plugin surefire? – palacsint

Respuesta

16

Si tiene una prueba con la anotación @Ignore, entonces es un comportamiento normal que @BeforeClass & @AfterClass se ejecute, independientemente de si todas las pruebas tienen @Ignored.

Si, sin embargo, la clase tiene una anotación @Ignore, la @BeforeClass & @AfterClass no se ejecuta.

Para maven, si no quiere ejecutar ninguna prueba en una clase en particular, entonces debe ignorarlas en surefire o failsafe. Agregue esto a la configuración experta (véase Maven Surefire Plugin)

<excludes> 
<exclude>**/FoobarTest.class</exclude> 
</excludes> 
+0

Ugh. Entonces, eso responde a la pregunta "¿Funciona de esta manera?", Sin embargo, ¿CUÁL ES EL INFIERNO? Esto es tan estúpido, ¿por qué querría que se ejecutara el código antes y después para una clase cuyas pruebas no se ejecutarán? - pero deja la pregunta de cómo Surefire se está comportando tan extrañamente. ¿Por qué algunas pruebas aleatorias y no relacionadas no se ejecutan en absoluto cuando sucede esto? – Coderer

+0

¿Es posible que haya pasado por alto que "toda la clase está decorada con @Ignore"? – palacsint

+0

Dijo que las pruebas fueron ignoradas, no la clase. Tienes razón en que la clase en sí misma puede ser ignorada. –

7

Medio Ambiente: JDK 1.6, 2.9 plug-in de éxito seguro, jUnit 4.8.1, Maven 3.0, 3.0.3, 2.2.1.

creé esta clase de prueba:

import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.Ignore; 
import org.junit.Test; 

@Ignore 
public class IgnoreTest { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("BEFORE CLASS"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("AFTER CLASS"); 
    } 

    @Test 
    public void test1() throws Exception { 
     System.out.println("test1"); 
    } 

    @Test 
    public void test2() throws Exception { 
     System.out.println("test2"); 
    } 

    @Test 
    public void test3() throws Exception { 
     System.out.println("test3"); 
    } 
} 

Entonces mvn clean test imprimir esta:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.015 sec 

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 1 

Obras como se esperaba. Si quito el @Ignore y correr de nuevo mvn clean test imprime esto:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest 
BEFORE CLASS 
test2 
test1 
test3 
AFTER CLASS 
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 sec 

Results : 

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 

Por lo tanto, a mí me funciona con tres versiones diferentes de Maven. No @BeforeClass/@AfterClass se ejecutó en @Ignore clases d.

Hay una (tal vez más) situación cuando los métodos @BeforeClass/@AfterClass se podían ejecutar en una clase de prueba @Ignore d.Es cuando tu clase ignorado tiene una subclase no ignorado:

import org.junit.Test; 

public class IgnoreSubTest extends IgnoreTest { 

    @Test 
    public void test4() throws Exception { 
     System.out.println("test4 subclass"); 
    } 

} 

Resultados de mvn clean test:

Running hu.palacsint.stackoverflow.q7535177.IgnoreTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.047 sec 
Running hu.palacsint.stackoverflow.q7535177.IgnoreSubTest 
BEFORE CLASS 
test4 subclass 
test1 
test2 
test3 
AFTER CLASS 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 sec 

Results : 

Tests run: 5, Failures: 0, Errors: 0, Skipped: 1 

En este caso los @BeforeClass y los métodos @AfterClass se ejecuta, ya que son métodos de la clase IgnoreSubTest prueba.

+0

Dos cosas: una, tenga en cuenta que su primera ejecución muestra "Pruebas ejecutadas: 1" aunque todo se ignora, y "Saltado: 1" aunque hay tres métodos decorados con '@ Test'. Entonces, Surefire (¿o quizás JUnit?) Ya está manguera allí. Dos, tengo demasiado código para pegar * todo * aquí, pero créanme cuando digo que '@ Ignorar' la clase provoca que no se ejecuten muchas pruebas no relacionadas, mientras que comentar los métodos' @ BeforeClass' corrige el problema. Solo desearía poder explicar * por qué *. – Coderer

+0

jUnit dijo que "Pruebas ejecutadas: 5 ... Omitidas: 1" - Significa para mí que intentó ejecutar 5 pruebas y 1 de las 5 tiene '@ Ignore'. Creo que es correcto jUnit simplemente funciona de esta manera. Para el segundo problema: debe limitar su investigación a solo unas pocas pruebas. Guarda/confirma tu código, elige entre 3 y 4 pruebas relevantes y elimina las otras y trata de reproducir un error con este pequeño subconjunto de tus pruebas. Luego edita tu pregunta :) – palacsint

Cuestiones relacionadas