2009-11-30 23 views
29

¿Qué se usa para escribir pruebas basadas en datos en jUnit?Pruebas basadas en datos con jUnit

(Mi definición de) una prueba basada en datos es una prueba que lee datos de una fuente externa (archivo, base de datos, ...), ejecuta una prueba por línea/archivo/lo que sea y muestra los resultados en un corrector de prueba como si tuviera pruebas separadas: el resultado de cada ejecución se muestra por separado, no en un gran agregado.

Respuesta

37

En JUnit4 puede utilizar el testrunner Parameterized para realizar pruebas controladas por datos.

No está muy bien documentado, pero la idea básica es crear un método estático (anotado con @Parameters) que devuelva una colección de matrices de objetos. Cada una de estas matrices se usa como argumentos para el constructor de la clase de prueba, y luego los métodos de prueba usuales se pueden ejecutar usando los campos establecidos en el constructor.

Puede escribir código para leer y analizar un archivo de texto externo en el método @Parameters (u obtener datos de otra fuente externa), y luego podría agregar nuevas pruebas editando este archivo sin volver a compilar las pruebas.

+0

Digamos que quiero pasar un argumento a la clase de prueba desde el método principal en base al cual aspiro a filtrar las pruebas que deseo ejecutar. ¿Puedo hacer eso? –

0

Normalmente, las pruebas basadas en datos utilizan un pequeño componente comprobable para manejar los datos. (Archivo de lectura de objetos u objetos simulados) Para las bases de datos, y los recursos externos a la aplicación se utilizan para simular otros sistemas. (Servicios web y bases de datos, etc.). Normalmente veo que hay archivos de datos externos que manejan los datos y la salida. De esta forma, el archivo de datos se puede agregar al VCS.

4

utilizo combinación de dbUnit, jMock y jUnit 4. A continuación, puede ejecutarlo como éter conjunto o por separado

+2

Untils es un marco agradable para armarlo todo. – dustmachine

+0

¿Quiere decir Unitils (http://www.unitils.org/)? Parece interesante, de hecho, ¡gracias por la propina! – Bostone

0

la actualidad tienen un archivo de apoyos con los números de identificación en el mismo. Esto es horriblemente frágil, pero es fácil hacer que algo funcione. Nuestro plan es inicialmente tener estos números de ID anulables por las propiedades -D en nuestras compilaciones de ant.

Nuestro entorno utiliza una base de datos heredada con datos terriblemente entrelazados que no se pueden cargar antes de una ejecución (por ejemplo, mediante dbUnit). Finalmente, nos gustaría llegar a donde una prueba unitaria consultará al DB para encontrar un ID con la propiedad bajo prueba, luego use ese ID en la prueba unitaria. Sería lento y se llama más pruebas de integración, no "pruebas unitarias", pero estaríamos probando con datos reales para evitar la situación en la que nuestra aplicación funciona perfectamente con datos de prueba pero falla con datos reales.

8

Utilizo una base de datos en memoria como hsqldb para poder rellenar previamente la base de datos con un conjunto de datos de "estilo de producción" o puedo comenzar con una base de datos hsqldb vacía y llenarla con filas que necesito realizar mi prueba Además de eso, escribiré mis pruebas usando JUnit y Mockito.

+2

No estoy seguro de por qué no votó en esta respuesta. Sin duda es un enfoque válido. – serg10

0

Algunas pruebas se prestan a ser impulsadas por interfaz.

Si las lecturas de la base de datos/archivo se recuperan mediante una llamada de interfaz, simplemente obtenga su prueba de unidad para implementar la interfaz y la clase de prueba de unidad puede devolver los datos que desee.

1

Estoy con @DroidIn.net, eso es exactamente lo que estoy haciendo, sin embargo, para responder a su pregunta literalmente "y muestra los resultados en un corredor de prueba como si tuviera pruebas separadas", debe mirar el JUnit4 corredor parametrizado. DBUnit no hace eso. Si tiene que hacer mucho de esto, honestamente TestNG es más flexible, pero puede hacerlo en JUnit.

También puede consultar el corredor de JUnit Theories, pero mi recuerdo es que no es ideal para conjuntos de datos controlados por datos, lo que tiene sentido porque JUnit no trata de trabajar con grandes cantidades de datos externos.

9

Aquí es donde brilla TestNG, con su @DataSource. Esa es una de las razones por las que prefiero JUnit; los otros son dependencias y pruebas paralelas con hilos.

+0

+1 eso es exactamente lo que habría escrito :-) – Davide

+0

Siete años después, he cambiado de opinión; Tiendo a quedarme con JUnit. Las pruebas parametrizadas son útiles. – duffymo

1

Aunque este es un tema bastante antiguo, todavía pensaba en contribuir con mi parte. Creo que el soporte de JUnit para las pruebas basadas en datos es menos y menos hostil. por ej. para usar parametrizado, necesitamos escribir nuestro constructor. Con Theories runner no tenemos control sobre el conjunto de datos de prueba que se pasan al método de prueba.

hay más inconvenientes como se identifica en este blog postal de la serie: http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

En la actualidad existe una solución integral que viene a lo largo de bastante bien en forma de Easytest que es marco aa extendido fuera de JUnit y está destinado a dar una mucha funcionalidad para sus usuarios. Su objetivo principal es realizar pruebas controladas por datos utilizando JUnit, aunque ya no es necesario que dependas realmente de JUnit. Aquí está el proyecto github para refernece: https://github.com/anujgandharv/easytest

Si alguien está interesado en contribuir con sus pensamientos/código/sugerencias a continuación, este es el momento. Simplemente puede ir al repositorio de Github y crear problemas.

2

Es mejor que amplíe TestCase con un "DataDrivenTestCase" que se adapte a sus necesidades. Aquí está el ejemplo de trabajo: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

A diferencia de las pruebas parametrizadas, permite casos de prueba bien nombrados.

+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

@Mathieu. esto es algo caliente los marcos de prueba vienen y van, pero esto es sólido como una roca con el viejo y simple junit. Muchas gracias! – Bastl

Cuestiones relacionadas