CommunitySchreiben & Editierengithub.com

photoeven2-netizen/astronusa

Einheitstests für Funktionen, Methoden und Klassen mit `package:test` schreiben und organisieren. Nutze dies beim Erstellen neuer Logik oder beim Beheben von Fehlern, um sicherzustellen, dass der Code korrekt und regressionsfrei bleibt.

Was ist astronusa?

Diese Skill-Direktive leitet Entwickler an, robuste Test-Suiten für Dart- und Flutter-Anwendungen mit dem standardmäßigen `package:test` zu erstellen. Sie betont die Strukturierung von Testdateien als Spiegelbild der `lib/`-Struktur, das Anhängen von `_test.dart` an Dateinamen und die Verwendung von `group()`, `test()` und `expect()` zur Validierung. Die Anleitung behandelt asynchrone Testabläufe, Setup/Teardown über `setUp()` und `tearDown()` sowie das Mocking mit `package:mockito` für abhängigkeitsinjizierten Code. Sie ist sowohl für reine Dart-Projekte (mittels `dart test`) als auch für Flutter-Projekte (mittels `flutter test`) anwendbar und bietet eine Schritt-für-Schritt-Checkliste zur Implementierung neuer Test-Suiten. Der Workflow umfasst eine Feedback-Schleife: Test ausführen, Fehleranalyse im Stacktrace, Behebung und erneutes Testen, bis alle Prüfungen bestehen. Beispiele demonstrieren sowohl einen standardmäßigen Komponententest mit einem Taschenrechner als auch das Mocking eines API-Clients mit Mockito, um messbare, regressionsfreie Ergebnisse zu gewährleisten.

Funktioniert mit~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/photoeven2-netizen/astronusa/tree/HEAD/.agents/skills/dart-add-unit-test

Installed? Explore more Schreiben & Editieren skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Testen von Dart- und Flutter-Anwendungen

Inhalt

Strukturierung von Testdateien

Organisiere Testdateien spiegelbildlich zur lib-Verzeichnisstruktur, um Vorhersagbarkeit zu gewährleisten.

  • Platziere den gesamten Testcode im test-Verzeichnis auf der obersten Ebene des Pakets.
  • Füge _test.dart an das Ende aller Testdateinamen an (z.B. lib/src/utils.dart sollte in test/src/utils_test.dart getestet werden).
  • Wenn du Integrationstests schreibst, platziere sie in einem integration_test-Verzeichnis auf der obersten Ebene des Pakets.

Schreiben von Tests

Verwende package:test als Standard-Testbibliothek für Dart-Anwendungen.

  • Importiere package:test/test.dart (oder package:flutter_test/flutter_test.dart für Flutter).
  • Gruppiere verwandte Tests mit der group()-Funktion, um einen gemeinsamen Kontext bereitzustellen.
  • Definiere einzelne Testfälle mit der test()-Funktion.
  • Validiere Ergebnisse mit der expect()-Funktion zusammen mit Matchern (z.B. equals(), isTrue, throwsA()).
  • Schreibe asynchrone Tests mit der standardmäßigen async/await-Syntax. Der Testrunner wartet automatisch auf den Abschluss des Future.
  • Verwalte Test-Setup und -Teardown mit setUp()- und tearDown()-Callbacks.
  • Wenn Code getestet wird, der auf Abhängigkeitsinjektion angewiesen ist, verwende package:mockito zusammen mit package:test, um Mock-Objekte zu generieren, festgelegte Szenarien zu konfigurieren und Interaktionen zu überprüfen.

Ausführen von Tests

Wähle den passenden Testrunner basierend auf dem Projekttyp und dem Speicherort der Tests aus.

  • Wenn du an einem reinen Dart-Projekt arbeitest, führe die Tests mit dem Befehl dart test aus.
  • Wenn du an einem Flutter-Projekt arbeitest, führe die Tests mit dem Befehl flutter test aus.
  • Wenn du Integrationstests ausführst, gib explizit den Verzeichnispfad an, da der Standard-Runner ihn ignoriert: dart test integration_test oder flutter test integration_test.

Workflow zur Testimplementierung

Befolge diesen sequenziellen Workflow bei der Implementierung neuer Test-Suiten. Kopiere die Checkliste, um deinen Fortschritt zu verfolgen.

Aufgabenfortschritt

  • 1. Erstelle die Testdatei im Verzeichnis test/ und stelle sicher, dass das Suffix _test.dart vorhanden ist.
  • 2. Importiere package:test/test.dart und die Ziellibrary.
  • 3. Definiere eine main()-Funktion.
  • 4. Initialisiere gemeinsame Ressourcen oder Mocks mit setUp().
  • 5. Schreibe test()-Fälle, gruppiert nach Funktionalität mit group().
  • 6. Führe die Test-Suite mit dem entsprechenden CLI-Befehl aus.
  • 7. Feedback-Schleife: Test ausführen → Stacktrace auf Fehler überprüfen → Implementierung oder Assertions korrigieren → Erneut ausführen, bis der Test bestanden wird.

Beispiele

Standard-Komponententest-Suite

Zeigt Gruppierung, Setup, synchrones und asynchrones Testen.

import 'package:test/test.dart';
import 'package:my_package/calculator.dart';

void main() {
  group('Calculator', () {
    late Calculator calc;

    setUp(() {
      calc = Calculator();
    });

    test('adds two numbers correctly', () {
      expect(calc.add(2, 3), equals(5));
    });

    test('handles asynchronous operations', () async {
      final result = await calc.fetchRemoteValue();
      expect(result, isNotNull);
      expect(result, greaterThan(0));
    });
  });
}

Mocking mit Mockito

Zeigt das Konfigurieren eines Mock-Objekts für das Testen von Abhängigkeitsinjektionen.

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';

// Generiere den Mock mit 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('returns parsed data on successful API call', () async {
      // Konfiguriere den Mock
      when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');

      // Führe das zu testende System aus
      final result = await dataService.fetchData();

      // Überprüfe Ergebnisse und Interaktionen
      expect(result.id, equals(1));
      verify(mockApiClient.get('/data')).called(1);
    });
  });
}

Individual skills in this repo

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

Verwandte Skills