Implementación de cobertura de pruebas en Dart y Flutter
Contenido
- Fundamentos de pruebas
- Directivas de cobertura
- Flujo de trabajo: Configurar y generar informes de cobertura
- Flujo de trabajo: Recolección manual avanzada de cobertura
- Ejemplos
Fundamentos de pruebas
Estructura tus suites de pruebas utilizando los paradigmas estándar de pruebas en Dart. Usa package:test para proyectos Dart y flutter_test para proyectos Flutter.
- Pruebas unitarias: Verifican funciones, métodos o clases individuales.
- Pruebas de componentes/widgets: Verifican el comportamiento, diseño e interacción de componentes usando objetos simulados (
package:mockito). - Pruebas de integración: Verifican flujos completos de la aplicación en dispositivos simulados o reales.
Directivas de cobertura
Excluye líneas, bloques o archivos completos de las métricas de cobertura usando comentarios en línea. Usa la bandera --check-ignore durante el formateo para aplicar estas directivas.
- Ignorar una línea:
// coverage:ignore-line - Ignorar un bloque de código:
// coverage:ignore-starty// coverage:ignore-end - Ignorar un archivo completo:
// coverage:ignore-file
Flujo de trabajo: Configurar y generar informes de cobertura
Sigue este flujo secuencial para agregar el paquete coverage, ejecutar las pruebas y generar un informe LCOV.
Lista de verificación de progreso de tareas:
- 1. Agregar
coveragecomodev_dependency. - 2. Ejecutar el script automático de cobertura.
- 3. Validar la salida LCOV.
1. Agregar dependencias
Agrega el paquete coverage como dev_dependency a tu proyecto. No lo agregues a las dependencias estándar.
Si trabajas en un proyecto Dart estándar:
dart pub add dev:coverage
Si trabajas en un proyecto Flutter:
flutter pub add dev:coverage
2. Recolectar cobertura y generar LCOV
Usa el script incluido test_with_coverage. Este script ejecuta automáticamente todas las pruebas, recolecta los datos JSON de cobertura de la máquina virtual Dart y los formatea en un informe LCOV.
dart run coverage:test_with_coverage
Nota: Si trabajas dentro de un espacio de trabajo Dart (monorepo), especifica los directorios de prueba explícitamente (ej: dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test).
3. Bucle de retroalimentación: Validar salida
Ejecutar validador -> revisar errores -> corregir:
- Verifica que se haya creado el directorio
coverage/en la raíz del proyecto. - Asegúrate de que existan
coverage/coverage.json(datos sin procesar) ycoverage/lcov.info(informe formateado). - Si falta cobertura para archivos específicos, asegúrate de que sean importados y ejecutados por tus archivos de prueba, o agrega
// coverage:ignore-filesi están intencionalmente excluidos.
Flujo de trabajo: Recolección manual avanzada de cobertura
Si necesitas control granular sobre el servicio VM, pausa de aislamientos o cobertura a nivel de ramas y funciones, usa el flujo de trabajo manual.
Lista de verificación de progreso de tareas:
- 1. Ejecutar pruebas con el servicio VM habilitado.
- 2. Recolectar cobertura JSON sin procesar.
- 3. Formatear JSON a LCOV.
1. Ejecutar pruebas con el servicio VM
Ejecuta las pruebas mientras pausas los aislamientos al salir y expones el servicio VM en un puerto específico (ej: 8181).
dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &
2. Recolectar cobertura sin procesar
Extrae los datos de cobertura del servicio VM en ejecución y escríbelos en un archivo JSON.
dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates
Opcional: Agrega --function-coverage y --branch-coverage para obtener métricas más profundas (requiere Dart VM 2.17.0+).
3. Formatear a LCOV
Convierte los datos JSON sin procesar al formato LCOV estándar.
dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore
Ejemplos
Ejemplo: Configuración de pubspec.yaml
Asegúrate de que tu pubspec.yaml refleje el paquete coverage estrictamente bajo dev_dependencies.
name: my_dart_app
environment:
sdk: ^3.0.0
dependencies:
path: ^1.8.0
dev_dependencies:
test: ^1.24.0
coverage: ^1.15.0
Ejemplo: Aplicar directivas de ignorar
Usa directivas de ignorar para evitar que el código generado o casos límite no comprobables reduzcan los puntajes de cobertura.
// coverage:ignore-file
import 'package:meta/meta.dart';
class SystemConfig {
final String env;
SystemConfig(this.env);
// coverage:ignore-start
void legacyInit() {
print('Deprecated initialization');
}
// coverage:ignore-end
bool isProduction() {
if (env == 'prod') return true;
return false; // coverage:ignore-line
}
}