Implémentation de la couverture de tests Dart et Flutter
Contenu
- Fondamentaux des tests
- Directives de couverture
- Flux de travail : Configuration et génération de rapports de couverture
- Flux de travail : Collecte avancée manuelle de couverture
- Exemples
Fondamentaux des tests
Structurez vos suites de tests en suivant les paradigmes de test standard de Dart. Utilisez package:test pour les projets Dart et flutter_test pour les projets Flutter.
- Tests unitaires : Vérifiez les fonctions, méthodes ou classes individuelles.
- Tests de composants/widgets : Vérifiez le comportement, la mise en page et l'interaction des composants en utilisant des objets mock (
package:mockito). - Tests d'intégration : Vérifiez les flux d'application complets sur des appareils simulés ou réels.
Directives de couverture
Excluez des lignes spécifiques, des blocs ou des fichiers entiers des métriques de couverture en utilisant des commentaires inline. Passez le drapeau --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
Flux de travail : Configuration et génération de rapports de couverture
Suivez ce flux de travail séquentiel pour ajouter le package coverage, exécuter les tests et générer un rapport LCOV.
Liste de contrôle de la 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 test_with_coverage fourni. Ce script exécute automatiquement tous les tests, collecte les données de couverture JSON de la VM Dart et les formate dans un rapport LCOV.
dart run coverage:test_with_coverage
Remarque : Si vous travaillez dans un workspace 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 feedback : 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
coverage/coverage.json(données brutes) etcoverage/lcov.info(rapport formaté) existent. - Si la couverture est manquante pour des fichiers spécifiques, 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.
Flux de travail : Collecte avancée manuelle de couverture
Si vous avez besoin d'un contrôle granulaire sur le service VM, la mise en pause des isolates, ou si vous avez besoin d'une couverture au niveau des branches/fonctions, utilisez le flux de travail de collecte manuelle.
Liste de contrôle de la progression des tâches :
- [ ] 1. Exécuter les tests avec le service VM activé.
- [ ] 2. Collecter la couverture JSON brute.
- [ ] 3. Formater 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 envoyez-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 recueillir des métriques plus approfondies (nécessite Dart VM 2.17.0+).
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 reflète 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 le code généré ou les cas limites non testables de diminuer 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
}
}