java - unitaria - Pruebas basadas en datos con jUnit
pruebas unitarias pdf (10)
¿Qué usas para escribir pruebas basadas en datos en 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 corredor de prueba como si usted tuvo pruebas separadas: el resultado de cada ejecución se muestra por separado, no en un gran agregado.
A pesar de que este es un tema bastante antiguo, todavía pensaba en contribuir con mi parte. Siento que el apoyo de JUnit para las pruebas basadas en datos es menos y menos desagradable. 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 identificados en esta publicación de blog: http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html
Ahora hay una solución integral que se presenta muy bien en forma de EasyTest, que es un marco que se extiende desde JUnit y está destinado a brindar una gran cantidad de funcionalidades a 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 referencia: https://github.com/anujgandharv/easytest
Si alguien está interesado en contribuir con sus pensamientos / códigos / sugerencias, este es el momento. Simplemente puede ir al repositorio de Github y crear problemas.
Actualmente tenemos un archivo de utilería con nuestros números de identificación. 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 un DB heredado 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.
Algunas pruebas se prestarán a ser impulsadas por la 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 la unidad puede devolver los datos que desee.
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.
En JUnit4 puede usar el testrunner Parameterized para realizar pruebas basadas en 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.
Es mejor que extienda 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.
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 corredor parametrizado JUnit4. 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.
Típicamente, las pruebas basadas en datos usan 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.
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 para realizar mi pruebas. Además de eso, escribiré mis pruebas usando JUnit y Mockito .