Implementierung von Dart- und Flutter-Testabdeckung
Inhalt
- Testgrundlagen
- Abdeckungsdirektiven
- Workflow: Konfigurieren und Erstellen von Abdeckungsberichten
- Workflow: Erweiterte manuelle Abdeckungserfassung
- Beispiele
Testgrundlagen
Strukturieren Sie Ihre Testsuiten nach den standardmäßigen Dart-Testparadigmen. Verwenden Sie package:test für Dart-Projekte und flutter_test für Flutter-Projekte.
- Unit-Tests: Überprüfen einzelne Funktionen, Methoden oder Klassen.
- Komponenten-/Widget-Tests: Überprüfen Komponentenverhalten, Layout und Interaktion mit Mock-Objekten (
package:mockito). - Integrationstests: Überprüfen vollständige App-Abläufe auf simulierten oder echten Geräten.
Abdeckungsdirektiven
Schließen Sie bestimmte Zeilen, Blöcke oder ganze Dateien mit Inline-Kommentaren von der Abdeckungsmessung aus. Übergeben Sie das Flag --check-ignore während der Formatierung, um diese Direktiven durchzusetzen.
- Einzelne Zeile ignorieren:
// coverage:ignore-line - Codeblock ignorieren:
// coverage:ignore-startund// coverage:ignore-end - Ganze Datei ignorieren:
// coverage:ignore-file
Workflow: Konfigurieren und Erstellen von Abdeckungsberichten
Folgen Sie diesem sequenziellen Workflow, um das coverage-Paket hinzuzufügen, Tests auszuführen und einen LCOV-Bericht zu generieren.
Aufgabenfortschritts-Checkliste:
- 1.
coveragealsdev_dependencyhinzufügen. - 2. Das automatisierte Abdeckungsskript ausführen.
- 3. Die LCOV-Ausgabe validieren.
1. Abhängigkeiten hinzufügen
Fügen Sie das coverage-Paket als dev_dependency zu Ihrem Projekt hinzu. Fügen Sie es nicht zu den Standardabhängigkeiten hinzu.
Bei einem standardmäßigen Dart-Projekt:
dart pub add dev:coverage
Bei einem Flutter-Projekt:
flutter pub add dev:coverage
2. Abdeckung erfassen und LCOV generieren
Verwenden Sie das integrierte Skript test_with_coverage. Dieses Skript führt automatisch alle Tests aus, sammelt die JSON-Abdeckungsdaten von der Dart-VM und formatiert sie in einen LCOV-Bericht.
dart run coverage:test_with_coverage
Hinweis: Wenn Sie in einem Dart-Workspace (Monorepo) arbeiten, geben Sie die Testverzeichnisse explizit an (z.B. dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test).
3. Rückmeldungsschleife: Ausgabe validieren
Validator ausführen -> Fehler überprüfen -> korrigieren:
- Stellen Sie sicher, dass das Verzeichnis
coverage/im Projektstammverzeichnis erstellt wurde. - Stellen Sie sicher, dass
coverage/coverage.json(Rohdaten) undcoverage/lcov.info(formatierter Bericht) vorhanden sind. - Wenn die Abdeckung für bestimmte Dateien fehlt, stellen Sie sicher, dass diese importiert und von Ihren Testdateien ausgeführt werden, oder fügen Sie
// coverage:ignore-filehinzu, wenn sie absichtlich ausgeschlossen sind.
Workflow: Erweiterte manuelle Abdeckungserfassung
Wenn Sie eine detaillierte Kontrolle über den VM-Dienst, das Anhalten von Isolaten oder eine Abdeckung auf Verzweigungs-/Funktionsebene benötigen, verwenden Sie den manuellen Workflow.
Aufgabenfortschritts-Checkliste:
- 1. Tests mit aktiviertem VM-Dienst ausführen.
- 2. Roh-JSON-Abdeckung erfassen.
- 3. JSON in LCOV formatieren.
1. Tests mit VM-Dienst ausführen
Führen Sie Tests aus, während Sie Isolate beim Beenden anhalten und den VM-Dienst auf einem bestimmten Port (z.B. 8181) freigeben.
dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &
2. Rohabdeckung erfassen
Extrahieren Sie die Abdeckungsdaten vom laufenden VM-Dienst und geben Sie sie in eine JSON-Datei aus.
dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates
Optional: Hängen Sie --function-coverage und --branch-coverage an, um tiefere Metriken zu sammeln (erfordert Dart VM 2.17.0+).
3. In LCOV formatieren
Konvertieren Sie die rohen JSON-Daten in das standardmäßige LCOV-Format.
dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore
Beispiele
Beispiel: pubspec.yaml-Konfiguration
Stellen Sie sicher, dass Ihre pubspec.yaml das coverage-Paket strikt unter dev_dependencies aufführt.
name: my_dart_app
environment:
sdk: ^3.0.0
dependencies:
path: ^1.8.0
dev_dependencies:
test: ^1.24.0
coverage: ^1.15.0
Beispiel: Anwenden von Ignore-Direktiven
Verwenden Sie Ignore-Direktiven, um zu verhindern, dass generierter Code oder nicht testbare Randfälle die Abdeckungswerte senken.
// coverage:ignore-file
import 'package:meta/meta.dart';
class SystemConfig {
final String env;
SystemConfig(this.env);
// coverage:ignore-start
void legacyInit() {
print('Veraltete Initialisierung');
}
// coverage:ignore-end
bool isProduction() {
if (env == 'prod') return true;
return false; // coverage:ignore-line
}
}