Implémenter la couverture de test Dart et Flutter
Sommaire
- Fondamentaux des tests
- Directives de couverture
- Workflow : configurer et générer des rapports de couverture
- Workflow : collecte manuelle avancée de la couverture
- Exemples
Fondamentaux des tests
Structurez vos suites de tests en utilisant les paradigmes standard de Dart. Utilisez package:test pour les projets Dart et flutter_test pour les projets Flutter.
- Tests unitaires : Vérifient des fonctions, méthodes ou classes individuelles.
- Tests de composants/widgets : Vérifient le comportement, la disposition et l'interaction des composants à l'aide d'objets mock (
package:mockito). - Tests d'intégration : Vérifient les flux complets de l'application sur des appareils simulés ou réels.
Directives de couverture
Excluez des lignes, blocs ou fichiers entiers des métriques de couverture à l'aide de commentaires en ligne. Passez le flag --check-ignore lors du formatage pour appliquer ces directives.
- Ignorer une seule ligne :
// coverage:ignore-line - Ignorer un bloc de code :
// coverage:ignore-startet// coverage:ignore-end - Ignorer un fichier entier :
// coverage:ignore-file
Workflow : configurer et générer des rapports de couverture
Suivez ce workflow séquentiel pour ajouter le package coverage, exécuter les tests et générer un rapport LCOV.
Liste de progression des tâches :
- 1. Ajouter
coveragecommedev_dependency. - 2. Exécuter le script de couverture automatisé.
- 3. Valider la sortie LCOV.
1. Ajouter les dépendances
Ajoutez le package coverage comme dev_dependency à votre projet. Ne l'ajoutez pas aux dépendances standard.
Si vous travaillez dans un projet Dart standard :
dart pub add dev:coverage
Si vous travaillez dans un projet Flutter :
flutter pub add dev:coverage
2. Collecter la couverture et générer LCOV
Utilisez le script intégré test_with_coverage. Ce script exécute automatiquement tous les tests, collecte les données de couverture JSON depuis la machine virtuelle Dart et les formate en un rapport LCOV.
dart run coverage:test_with_coverage
Remarque : Si vous travaillez dans un espace de travail Dart (monorepo), spécifiez explicitement les répertoires de test (par exemple, dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test).
3. Boucle de rétroaction : valider la sortie
Exécuter le validateur -> examiner les erreurs -> corriger :
- Vérifiez que le répertoire
coverage/a été créé à la racine du projet. - Assurez-vous que les fichiers
coverage/coverage.json(données brutes) etcoverage/lcov.info(rapport formaté) existent. - Si la couverture manque pour certains fichiers, assurez-vous qu'ils sont importés et exécutés par vos fichiers de test, ou ajoutez
// coverage:ignore-files'ils sont intentionnellement exclus.
Workflow : collecte manuelle avancée de la couverture
Si vous avez besoin d'un contrôle granulaire sur le service VM, la pause des isolates, ou une couverture au niveau des branches/fonctions, utilisez le workflow manuel.
Liste de progression des tâches :
- 1. Exécuter les tests avec le service VM activé.
- 2. Collecter la couverture JSON brute.
- 3. Formater le JSON en LCOV.
1. Exécuter les tests avec le service VM
Exécutez les tests en mettant en pause les isolates à la sortie et en exposant le service VM sur un port spécifique (par exemple, 8181).
dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &
2. Collecter la couverture brute
Extrayez les données de couverture du service VM en cours d'exécution et placez-les dans un fichier JSON.
dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates
Optionnel : Ajoutez --function-coverage et --branch-coverage pour obtenir des métriques plus profondes (nécessite Dart VM 2.17.0 ou supérieur).
3. Formater en LCOV
Convertissez les données JSON brutes au format LCOV standard.
dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore
Exemples
Exemple : Configuration pubspec.yaml
Assurez-vous que votre pubspec.yaml place le package coverage strictement sous 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
Exemple : Application des directives d'ignorance
Utilisez les directives d'ignorance pour empêcher que du code généré ou des cas limites non testables n'abaissent les scores de couverture.
// 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
}
}