La guía de de pruebas unitarias describe los pasos necesarios para la elaboración y ejecución de las misma.
Pruebas unitarias implementadas para los servicios de backend.
El objetivo de las pruebas es descubrir los errores y fallos cometidos durante las fases de desarrollo del software [1].
Las pruebas de caja blanca se centran en probar el comportamiento interno y la estructura del programa examinando la lógica interna, como muestra la Figura 1. Para ello:
Figura 1. Lógica interna de un programa [1].
La conducción de las pruebas de caja negra están determinadas por los datos de entrada y salida. Así, los datos de entrada deben generar una salida en concordancia con las especificaciones considerando el software como una caja negra sin tener en cuenta los detalles procedimentales de los programas.
Figura 2. Esquema de pruebas de caja negra [1].
La detección de errores tendra un costo mayor cuanto más tarde se detecten. Por tal motivo, es importante realizar comprobaciones de los resultados generados en cada fase del ciclo de vida del proyecto de software antes de pasar a la siguiente fase [1].
Tipos de estrategias de pruebas:
Junit, es el un framework que nos permite escribir y ejecutar pruebas unitarias en Java.
JUnit 5 inicialmente se llamo JUnit Lambda y está completamente reescrito en Java 8. Está rediseñado desde cero, superando los errores y limitaciones de las versiones anteriores. JUnit 5 es compatible con las versiones anteriores, por lo que también puedes ejecutar tus antiguas pruebas JUnit con él [2].
Mockito, es un framework de código abierto, que nos permite la creación de objetos simulados, con el propósito de realizar pruebas unitarias en Java.
Figura 3. Estructura del proyecto. Fuente: Equipo de Desarrollo
A continuación se puede observa el código fuente de la clase MedidaServiceImplTest.java.
@TestMethodOrder(OrderAnnotation.class)
@TestMethodOrder es una anotación de nivel de tipo, que se utiliza para configurar un método de ordenamiento para la ejecución de pruebas unitarias.
@Order(<numeración>)
El valor está ordenado por el método de prueba.
@TestInstance(Lifecycle.PER_CLASS)
La anotación @TestInstance nos permite configurar el ciclo de vida de las pruebas de JUnit 5. @TestInstance tiene dos: LifeCycle.PER_METHOD (el predeterminado) y LifeCycle.PER_CLASS. Este último, nos permite pedirle a JUnit que cree solo una instancia de la clase de prueba y la reutilice entre pruebas.
@BeforeEach
La anotación @BeforeEach se utiliza para señalar que el método anotado debe ejecutarse antes de cada @Test de la clase actual.
@ParameterizedTest
Las pruebas parametrizadas son como otras pruebas, excepto que agregamos la anotación @ParameterizedTest.
@MethodSource("<método>")
La anotación @MethodSource("<método>") proporciona acceso a los valores devueltos de la clase en la que se declara esta anotación.
mock(MedidaService.class)
El método mock() crea una copia de la implementación de MedidaService y el mecanismo utilizado es el proxy para la generación de la instancia.
[1] Bolaños, D. (2008). Pruebas de software y JUnit: un análisis en profundidad y ejemplos prácticos. Pearson Prentice Hall.
[2] Gulati, S., & Sharma, R. (2017). Java Unit Testing with JUnit 5: Test Driven Development with JUnit 5. Apress.