2012-03-16 12 views
7

Me gustaría implementar un mejor sistema para filtrar las pruebas para ejecutar bajo JUnit en Eclipse. Me gustaría las @Categories, pero no tengo que especificar la lista de clases en una anotación @SuiteClasses ({}), ya que creo que eso reduce el valor, aumenta la cantidad de mantenimiento manual que tenemos que hacer.Mejor o personalizado JUnit prueba de filtrado

¿Hay alguna forma de conectar el proceso donde Eclipse ejecuta la prueba JUnit, para poder hacer un filtrado personalizado en todas las clases con un @Test en él? P.ej. una clase como esta:

@CustomFilteredTesting 
    public class TheCustomFilteredTestRun { 
     public boolean includeThisTestClass(Class<?> klass) { 
      // e.g. test whether klass is in a package or subsystem 
      // or a subtype of some interface. 
     } 
    } 

Cualquier ayuda apreciada, -j

Respuesta

5

Eclipse utiliza el código JUnit por defecto para ejecutar las pruebas, por lo que sólo necesita enseñar JUnit su nuevo truco y eclipse será capaz de hacer eso.

Eso fuera del camino: ¿Cómo se pueden dividir las pruebas en suites sin @SuiteClasses?

Tough. Desde mi experiencia, hay varias soluciones:

  1. escribir una prueba que lee todas las suites y trata de encontrar todas las pruebas y luego se asegura de que cada prueba se encuentra en una suite. Esta prueba le permitirá saber cuándo olvidó agregar una nueva prueba a las suites.

    Agradable: Sin la magia de JUnit, te mantendrá a salvo si olvidas algo (como agregar un @Category a una nueva prueba).

    inconveniente: Necesita bastante feo Lectura de archivos/análisis de código/reflexión mojo.

  2. Puede escribir su propio corredor de prueba extendiendo BlockJUnit4ClassRunner. Eso le permitiría agregar sus propias anotaciones personalizadas para clasificar las pruebas y ejecutarlas.

  3. Agregar suposiciones. org.junit.Assume es una pequeña y agradable bestia que silenciosamente falla una prueba. La prueba no se ejecutará (o se ejecutará hasta que la primera suposición falle) pero tampoco registrará un error. Es un poco como un inteligente @Ignore

    Escriba el código de configuración que determina qué pruebas ejecutar y poner assumeThat() en su código.

en realidad prefieren utilizar suites porque:

  1. El "qué tengo todas las pruebas" prueba dice cuando estoy equivocado
  2. que tienen un único lugar donde puedo ver cuál es la prueba va donde
  3. puedo escribir fácilmente más pruebas para asegurarse de que las pruebas no se repiten en las suites
+0

puede pasar por todos estos aros o simplemente usar TestNG. – hidralisk

+0

Tengo un código cifrado que hace el descubrimiento de clase - ¡lo publicaré más tarde! – davidfrancis

+0

Buen esfuerzo; Aunque no lo entiendo del todo. - ¿A qué te refieres con "The" do tengo todas las pruebas "prueba"? Es bueno aprender sobre lo de Asumir, pero ¿cómo le comunico la intención de ejecutar un subconjunto específico de pruebas? –

2

Use TestNG. Tiene grupos de prueba, puede ver un ejemplo en la página principal. Tiene mejor soporte en pruebas parametrizadas. La integración con Spring a través de Spring-Test es mejor.

+0

Comprobando TestNG ... –

+0

Parece que TestNG usa cadenas como identificadores para grupos; p.ej. '@Test (groups = {"slow"})'. Eso significa que están completamente separados de los paquetes y otras cosas que se utilizan para crear una aplicación. Además, me gustaría usar algo que el IDE pueda hacer referencia cruzada. Facilita el mantenimiento. ¿Sabes si TestNG permite @Test (xgroups = ...) donde uno podría usar tipos en su lugar? –

+0

Jonas: la elección de las cadenas fue deliberada para que sea más fácil seleccionarlas con expresiones regulares (por ejemplo, "Ejecutar todos los métodos que pertenecen al grupo" front-end. * "). Eclipse, IDEA y los informes HTML le dan una informe al final que le dice todo lo que necesita hacer acerca de qué grupos se ejecutaron y no se ejecutan, qué métodos pertenecen a qué grupos, etc ... –

3

Considere el uso de ClassPathSuite: http://johanneslink.net/projects/cpsuite.jsp.Usamos y definimos una suite de la siguiente manera:

@RunWith(ClasspathSuite.class) 
@ExcludeBaseTypeFilter({ NotUnitTestable.class }) 
public class AllTests { 
} 

La exclusión no es posible utilizando Anotaciones así que simplemente define una interfaz de marcador (NotUnitTestable). Comenzamos nuestras pruebas de esta manera tanto en Eclipse como en nuestra compilación de línea de comando usando la integración JUnit ANT.

+0

Sugerencia interesante. Su objetivo principal lo entiendo como proyecto múltiple (¿módulo?) Sin embargo, no estoy seguro de que resuelva el problema. –

Cuestiones relacionadas