Diseño y realización de pruebas
Introducción
En esta Unidad aprenderemos a:
- Identificar los diferentes tipos de pruebas.
- Definir casos de prueba.
- Efectuar pruebas unitarias de clases y funciones.
- Efectuar pruebas de integración, de sistema y de aceptación.
- Realizar medidas de calidad sobre el software desarrollado.
Objetivos de las pruebas
Una buena prueba debe centrarse en dos objetivos:
- probar si el software no hace lo que debe hacer
- probar si el software hace lo que no debe hacer.
Existen distintos frameworks para la realización de pruebas.
Framework
En general, un framework (marco de trabajo) está compuesto por:
- un conjunto de las mejores prácticas y suposiciones
- herramientas comunes
- bibliotecas
Permite unificar el proceso de desarrollo entre desarrolladores.
Pruebas
Forma de las pruebas
Pruebas dinámicas: Requieren la ejecución de la aplicación. Permiten medir el comportamiento de la aplicación desarrollada.
Pruebas estáticas: Se realizan sin ejecutar el código de la aplicación. Se examina el código fuente.
Estrategias de prueba
Caja negra: Se estudia el sistema desde fuera. Son pruebas funcionales.
Caja blanca: Se examina el código fuente y su ejecución. Son pruebas estructurales.
Estrategias de prueba
Estrategias de prueba de caja negra
- Se estudia el sistema desde fuera.
- Se trabaja sobre la interfaz.
- No se tienen en cuenta los detalles internos de funcionamiento.
- Se proporcionan entradas y se estudian las salidas.
- Principales técnicas:
- Particiones de equivalencia
- Valores límite
Estrategias de prueba de caja blanca
- Se examina el código fuente y su ejecución.
- Se comprueban los flujos de ejecución dentro de cada unidad (función, clase, módulo, etc.)
- También pueden comprobarse los flujos entre unidades durante la integración.
- E incluso entre subsistemas, durante las pruebas de sistema.
- Principales técnicas:
- Cobertura lógica
- Prueba de bucles
Tipos de pruebas
Funcionales: Evaluan el cumplimiento de los requisitos.
No funcionales: Evaluan aspectos adicionales como rendimiento, seguridad, ...
Pruebas funcionales
- Pruebas unitarias (o de unidad)
- Pruebas de regresión
- Pruebas de integración
- Pruebas del sistema
- Pruebas de humo (smoke test)
- Pruebas alfa y beta
- Pruebas de aceptación (validación por parte del cliente)
Pruebas no funcionales
- Pruebas de usabilidad
- Pruebas de rendimiento
- Pruebas de stress
- Pruebas de seguridad
- Pruebas de compatibilidad
- Pruebas de portabilidad
- ...
Mecanismos de prueba
- Manual
- Mediante pruebas realizadas por personal de la empresa o externo.
- Automático
- Mediante software que ejecuta código de forma automatizada y compara los resultados obtenidos y los resultados esperados.
Soporte del depurador
- Puntos de ruptura
- Ejecución paso a paso
- Análisis de variables
Automatización de pruebas
- Frameworks de pruebas (xUnit)
- Aserciones
https://en.wikipedia.org/wiki/XUnit
Frameworks para pruebas
- Java: JUnit, TestNG
- C++: CppUnit, Google Test
- PHP: PHPUnit
- Javascript: Mocha
https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
Caso de prueba
- precondición --> postcondición
- Una entrada conocida --> Una salida esperada
http://www.jtech.ua.es/j2ee/publico/lja-2012-13/sesion04-apuntes.html
JUnit4/5 - Anotaciones
- @BeforeClass / @BeforeAll
- @Before / @BeforeEach
- @Test
- @After / @AfterEach
- @AfterClass / @AfterAll
- @Ignore
JUnit - Aserciones
import org.junit.Test;
import static org.junit.Assert.*;
// ...
fail() // el test termina con fallo
assertTrue(expresión) // expresión es true ?
assertFalse(expresión) // expresión es false ?
assertEquals(esperado,real) // esperado es igual a real ?
assertNotEquals(esperado,real) // esperado es distinto de real ?
assertNull(objeto) // objeto es null ?
assertNotNull(objeto) // objeto es distinto de null ?
// objeto_esperado es igual a objeto_real ?
assertSame(objeto_esperado,objeto_real)
// objeto_esperado es distinto de objeto_real ?
assertNotSame(objeto_esperado,objeto_real)
http://junit.org/junit4/javadoc/4.12/org/junit/Assert.html
TDD
- Desarrollo guiado por pruebas de software, o Test-Driven Development (TDD)
- Escribir las pruebas primero (Test First Development).
- Refactorización (Refactoring).
Integración
Formas de integración
- Integración Big bang
- Integración Descendente
- Integración Ascendente
- Integración Continua (CI)
Servidores de integración continua
CI : Integración continua
CD : Despliegue continuo
- Jenkins
- Bamboo
- TravisCI
- CircleCI
Note: CI=Continuous Integration / CD=Continuous Delivery.
Calidad
Control de calidad
Control de calidad = medición de la calidad de un producto --> Pruebas
Calidad del proceso/producto (QA/QC)
- QA es un conjunto de actividades para garantizar la calidad en los procesos mediante los cuales se desarrollan los productos.
- QC es un conjunto de actividades para garantizar la calidad de los productos. Las actividades se centran en identificar defectos en los productos reales producidos.
Note: QA = Quality Assurance / QC = Quality Control
Factores de calidad
- Corrección
- Fiabilidad
- Eficiencia
- Seguridad
- Facilidad de uso
- Mantenibilidad
- Flexibilidad
- Facilidad de prueba
- Portabilidad
- Reusabilidad
- Interoperatividad