Justificación: ¿Por qué?
-
No es necesario ningún framework para la gestión de pruebas automáticas:
-
Instanciar objetos que contengan el SUT
-
Enviar mensajes para ejecutar el SUT
-
Elevar una exepción si se verifica que la respuesta del SUT no es igual a la esperada.
-
-
… pero es muy conveniente para facilitar y acelerar su gestión
Ejemplos sin Junit | |
---|---|
|
|
Definición: ¿Qué?
-
Framework sencillo desarrollado por Kent Beck y Erich Gamma para escribir pruebas repetibles.
-
Es una instancia de XUnit, arquitectura para framework de pruebas unitarias: CppUnit, PhpUnit,…
-
Basado en: Metaclases, Anotaciones y Aserciones
-
Incluye:
-
Visualizadores de resultados, runners, en modo _texto, gráfico …
-
Plugins para principales IDEs, Eclipse, NetBeans, VisualStudio, …
-
Integración con gestores de proyectos: Ant, Maven, Gradle, …
-
-
Objetivos: ¿Para qué?
-
Gestionar eficientemente el código de pruebas unitarias, de componentes, integración y sistemas para estilos arquitectónicos como MVP-PM
-
Facilitar la reusabilidad específica del código de pruebas
-
Facilitar la legibilidad, escritura/lectura, con funciones estáticas especializadas para frente a la sentencia assert original del lenguaje
-
Agrupar jerarquias de Conjuntos de Clases de Pruebas (@TestSuite) que automatiza la ejecución de la totalidad de las Pruebas de Regresión
-
Categorizar de Clases de Pruebas (@Categories) que automatiza la ejecución de subconjuntos de la totalidad de los Casos de Prueba, para las pruebas Alfa, Beta o Humo
-
Descripción: ¿Cómo?
Pruebas Unitarias
Clases de Pruebas
-
Las Clases de Pruebas son clases normales (POJO) del lenguaje con atributos, métodos públicos y privados, miembros estáticos… relacionadas con otra clases como las del SUT que se ejercite, auxiliares (Factory, Builder,…) sin ninguna limitación excepto que su nombre debe terminar con el sufijo "Test"
Ejemplos: patrón Factory Method en pruebas | ||
---|---|---|
|
|
para el Código de Producción con un Jerarquia de Paquetes de Paquetes de la Arquitectura del Software |
el Código de Pruebas Unitarias con una Jerarquia de Paquetes paralela a la Arquitectura del Software del Código de Producción |
|
|
src/main/resources |
src/test/resources |
para los Recursos de Producción: imágenes de UI, ficheros de configuración,… con la estructura que se considere más adecuada |
para los Recursos de Pruebas: ficheros de datos para alimentar las pruebas,… con una Jerarquia de Paquetes paralela a la jerarquia Recursos de Producción para facilitar biunivocamente la localización de recursos de una prueba dada |
Ejemplos | |
---|---|
Método de Pruebas
Declaración | Ejecución | ||||
---|---|---|---|---|---|
|
|
Cuerpo del Método de Prueba | Una triple A (arrange/act/assert) y una parte opcional final: |
---|---|
Preparacion (Arrange/Seup) |
para la creación, relación, gestión de recursos (ficheros de datos, bases de datos,…),… de los objetos del SUT |
Acción (Act) |
para el ejercicio del SUT por el camino establecido en la prueba |
Aserción (Assert) |
para la comprobación de que el resultado esperado coincida con el resultado obtenido |
Demolición (TearDown) |
en caso necesarío, para liberar los recursos que fueron necesarios y devolverlos al estado anterior faciitando la idependencia de otros Métodos de Pruebas poder reutilizarlos en otro Metodos de Pruebas evitando su continua re-creación(no recomendado!!!) |
Ejemplos: | |
---|---|
Reusabilidad
|
|
Ejemplos: | ||
---|---|---|
Aserciones Avanzadas
Generación | Descripción |
---|---|
|
assert <expresión>; |
|
assertEquals(<expected>, <actual>); assertArrayEquals(<expected>, <actual>); assertNull(<expected>, <actual>); assertNotNull(<expected>, <actual>); assertSame(<expected>, <actual>); assertNotSame(<expected>, <actual>); assertTrue(<expected>, <actual>); assertFalse(<expected>, <actual>); fail(<expected>, <actual>);
|
|
|
- Objetivos de Hamcrest | |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ejemplos: | auxiliar.junit.AssertThatTest |
---|
Exepciones del SUT
Con excepciones | Con la anotación @Test | ||||||
---|---|---|---|---|---|---|---|
|
|
Ejemplos: | |
---|---|
Clase de Pruebas Parametrizada
-
En muchas clases de pruebas se escribe y se reescribe la creación de muchos objetos del SUT para ser ejercitados en distintos métodos de pruebas
-
Las Clases de Pruebas Parametrizadas buscan reutilizar los mismos accesorios del SUT escritos en todos los métodos de pruebas de la clase para cada elemento de una colección de accesorios del SUT definida separada y extensible.
Ejemplos: | ||
---|---|---|
Repitiendo código |
||
Sin repetir código |
||
Parametrizada |
||
Parametrizada sin Constructor |
Expiración del Tiempo de Ejecución
-
Para Pruebas de Rendimiento de los Requisitos no funcionales.
-
Por ejemplo, el cálculo de la existencia de las Tres en Raya no puede exceder los 5msg
-
la anotación @Test incorpora el atributo timeout inicializado con el valor del tiempo máximo en milisegundos que se concede al método para su ejecución.
-
Una vez expirado el tiempo , la prueba falla.
-
En caso contrario, dependerá del código de la prueba
-
-
Ejemplos: | |
---|---|
Conjuntos de Pruebas
Jerarquías de Pruebas
|
|
Categorías de Pruebas
-
Para poder configurar sub-conjuntos de pruebas como en el caso de pruebas alfa, beta, humo,…
|
|
|
|
|
|
Ejemplos: | src.test.java.auxiliar.junit.categories |
---|
Pruebas ignoradas
-
Mediante la anotación @Ignored acompañando al Metodo de Prueba, el framework no ejecutará dicho caso de prueba
Pruebas de Componentes
-
¿Todas las Clases de Pruebas mostradas anteriormente son unitarias? Existe un debate:
-
No! Estrictamente son aquellas que NO incorporan más de una clase en el SUT, sin ejercitar DOC´s
-
Por ejemplo: Coordinate Test no porque incorpora el enumerado Direction; BoardTest no porque incorpora objetos de la clase Coordinate; … sin dobles, se ejercita más de una clase!!!
-
Entonces deberían ser consideradas como Pruebas de Componentes…casi todas! O se ponen dobles!
-
-
Si! Relajadamente porque no salen del ámbito del componente: no acceden a clases de otros paquetes, no son de componentes
-
Entonces deberían ser consideradas como Pruebas de Unidad! No existen Pruebas de Componentes!
-
-
Si! Relajadamente porque no salen del código de producción: no acceden a recursos externos (por ejemplo, ficheros, base de datos, servicios,…) a través de otros componentes software (por ejemplo, librerías, protocolos,…), no son de integración
-
Entonces no existen Pruebas de Componentes! Se consideran todas unitarias!
-
-
Solución "practica": muchos desarrolladores no contemplan la existencia de Pruebas de Componentes especificamente y las consideran junto con las Pruebas Unitarias sin distinción
-
Elemplos: | |
---|---|
Pruebas de Integración
-
Serán aquellas que en el ejercicio del SUT se colabora con un DOC desarrollado en otro componente (por ejemplo: jar de una libreia, un servicio de bases de datos, …)
Ejemplos: | integration.DecisionTreeBroadTest |
---|
-
Si no interesa que sea una Prueba de Integración(p.e. para no decelerar las Pruebas de Regresión), habría que incorporar un doble para el DOC BufferedReader, FileReader y IOException y, asi convertirla en Prueba Unitaria/de Componente
Pruebas de Sistema
|
![]() |
Bibliografía
Obra, Autor y Edición | Portada | Obra, Autor y Edición | Portada |
---|---|---|---|
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
Metaclases
-
Es una clase cuyas instancias son clases que permiten la reflexión del código: un código que manipula como información paquetes,clases,método,atributos,objetos y mensajes
-
Ejemplo: auxiliar.withoutJUnit.MetaClazzesExample
-
Ejemplo: auxiliar.withoutJUnit.MetaClazzesInspectorExample
-

Anotaciones
-
Anotación es un mecanismo para añadir metadatos al código fuente Java que están disponibles en tiempo de compilación/ejecución.
-
Ejemplos:
-
[lime]#@Override,@SupressWarning#_…para el IDE
-
[lime]#@Entity,@Key#_,…para JPA de Swing
-
Ejemplos: auxiliar.withoutJUnit.AnnotationExample
-
Ejemplo: auxiliar.withoutJUnit.ClazzExample
-
Ejemplo: auxiliar.withoutJUnit.MetaClazzesWihtAnnotationsExample
-
-
-
Aserciones
-
Todas las funciones tienen un semántica similar al assert:
-
se comprueba una condición,si es cierta continúa la ejecución.
-
En caso contrario,la prueba no pasa y se continúa la ejecución por otro método de prueba de la clase
-