Pruebas en Aplicaciones Dart y Flutter
Contenido
- Estructuración de Archivos de Prueba
- Escritura de Pruebas
- Ejecución de Pruebas
- Flujo de Trabajo para Implementar Pruebas
- Ejemplos
Estructuración de Archivos de Prueba
Organiza los archivos de prueba de manera que reflejen la estructura del directorio lib para mantener la previsibilidad.
- Coloca todo el código de prueba dentro del directorio
testen la raíz del paquete. - Agrega
_test.dartal final de todos los nombres de archivos de prueba (por ejemplo,lib/src/utils.dartdebe probarse entest/src/utils_test.dart). - Si escribes pruebas de integración, colócalas en un directorio
integration_testen la raíz del paquete.
Escritura de Pruebas
Utiliza package:test como la biblioteca de pruebas estándar para aplicaciones Dart.
- Importa
package:test/test.dart(opackage:flutter_test/flutter_test.dartpara Flutter). - Agrupa pruebas relacionadas usando la función
group()para proporcionar un contexto compartido. - Define casos de prueba individuales usando la función
test(). - Valida los resultados usando la función
expect()junto con comparadores (por ejemplo,equals(),isTrue,throwsA()). - Escribe pruebas asíncronas usando la sintaxis estándar
async/await. El ejecutor de pruebas espera automáticamente a que elFuturese complete. - Gestiona la configuración y limpieza de pruebas usando los callbacks
setUp()ytearDown(). - Si pruebas código que depende de inyección de dependencias, usa
package:mockitojunto conpackage:testpara generar objetos mock, configurar escenarios fijos y verificar interacciones.
Ejecución de Pruebas
Selecciona el ejecutor de pruebas adecuado según el tipo de proyecto y la ubicación de las pruebas.
- Si trabajas en un proyecto Dart puro, ejecuta las pruebas usando el comando
dart test. - Si trabajas en un proyecto Flutter, ejecuta las pruebas usando el comando
flutter test. - Si ejecutas pruebas de integración, especifica explícitamente la ruta del directorio, ya que el ejecutor predeterminado lo ignora:
dart test integration_testoflutter test integration_test.
Flujo de Trabajo para Implementar Pruebas
Sigue este flujo de trabajo secuencial al implementar nuevos conjuntos de pruebas. Copia la lista de verificación para rastrear tu progreso.
Progreso de la Tarea
- 1. Crea el archivo de prueba en el directorio
test/, asegurando el sufijo_test.dart. - 2. Importa
package:test/test.darty la biblioteca objetivo. - 3. Define una función
main(). - 4. Inicializa recursos compartidos o mocks usando
setUp(). - 5. Escribe casos
test()agrupados por funcionalidad usandogroup(). - 6. Ejecuta el conjunto de pruebas usando el comando CLI apropiado.
- 7. Bucle de Retroalimentación: Ejecuta prueba -> Revisa el stack trace de fallos -> Corrige implementación o aserciones -> Vuelve a ejecutar hasta que pase.
Ejemplos
Conjunto de Pruebas Unitarias Estándar
Demuestra agrupación, configuración, pruebas síncronas y asíncronas.
import 'package:test/test.dart';
import 'package:my_package/calculator.dart';
void main() {
group('Calculator', () {
late Calculator calc;
setUp(() {
calc = Calculator();
});
test('suma dos números correctamente', () {
expect(calc.add(2, 3), equals(5));
});
test('maneja operaciones asíncronas', () async {
final result = await calc.fetchRemoteValue();
expect(result, isNotNull);
expect(result, greaterThan(0));
});
});
}
Mocking con Mockito
Demuestra la configuración de un objeto mock para pruebas de inyección de dependencias.
import 'package:test/test.dart';
import 'package:mockito/mockito.dart';
import 'package:mockito/annotations.dart';
import 'package:my_package/api_client.dart';
import 'package:my_package/data_service.dart';
// Genera el mock usando build_runner: dart run build_runner build
@GenerateNiceMocks([MockSpec<ApiClient>()])
import 'data_service_test.mocks.dart';
void main() {
group('DataService', () {
late MockApiClient mockApiClient;
late DataService dataService;
setUp(() {
mockApiClient = MockApiClient();
dataService = DataService(apiClient: mockApiClient);
});
test('devuelve datos parseados en una llamada API exitosa', () async {
// Configura el mock
when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');
// Ejecuta el sistema bajo prueba
final result = await dataService.fetchData();
// Verifica resultados e interacciones
expect(result.id, equals(1));
verify(mockApiClient.get('/data')).called(1);
});
});
}