photoeven2-netizen/astronusa

Collecter la couverture avec le package `coverage` et générer un rapport LCOV

Qu'est-ce que astronusa ?

Cette compétence permet aux développeurs Dart et Flutter de collecter des métriques de couverture de code et de générer des rapports au format LCOV, exploitable par des outils comme SonarQube ou Coveralls. Elle propose deux workflows : un automatisé simplifié via la commande `test_with_coverage`, et un avancé manuel offrant un contrôle total sur le service VM, la pause des isolates et le niveau de détail (fonctions, branches). La compétence détaille également l'ajout des directives `coverage:ignore-file`, `coverage:ignore-line` et `coverage:ignore-start/end` pour exclure du code intentionnellement, et fournit un guide pas à pas avec validation des fichiers générés. Elle est conçue pour les projets Dart standard et les projets Flutter, et fonctionne avec les dernières versions du SDK Dart.

Compatible avec~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/photoeven2-netizen/astronusa/tree/HEAD/.agents/skills/dart-collect-coverage

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Implémenter la couverture de test Dart et Flutter

Sommaire

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-start et // 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 coverage comme dev_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 :

  1. Vérifiez que le répertoire coverage/ a été créé à la racine du projet.
  2. Assurez-vous que les fichiers coverage/coverage.json (données brutes) et coverage/lcov.info (rapport formaté) existent.
  3. 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-file s'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
  }
}

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Skills associés