dart-add-unit-test

Par flutter · skills

Rédigez et organisez des tests unitaires pour les fonctions, méthodes et classes à l'aide de `package:test`. À utiliser lors de la création de nouvelle logique ou de la correction de bugs pour s'assurer que le code reste correct et exempt de régressions.

npx skills add https://github.com/flutter/skills --skill dart-add-unit-test

Test des applications Dart et Flutter

Contenu

Structurer les fichiers de test

Organisez les fichiers de test pour qu'ils reflètent la structure du répertoire lib afin de maintenir la prévisibilité.

  • Placez tout le code de test dans le répertoire test à la racine du package.
  • Ajoutez le suffixe _test.dart à la fin de tous les noms de fichiers de test (par exemple, lib/src/utils.dart doit être testé dans test/src/utils_test.dart).
  • Si vous écrivez des tests d'intégration, placez-les dans un répertoire integration_test à la racine du package.

Écrire des tests

Utilisez package:test comme bibliothèque de test standard pour les applications Dart.

  • Importez package:test/test.dart (ou package:flutter_test/flutter_test.dart pour Flutter).
  • Groupez les tests connexes en utilisant la fonction group() pour fournir un contexte partagé.
  • Définissez des cas de test individuels en utilisant la fonction test().
  • Validez les résultats en utilisant la fonction expect() aux côtés de matchers (par exemple, equals(), isTrue, throwsA()).
  • Écrivez des tests asynchrones en utilisant la syntaxe standard async/await. Le test runner attend automatiquement que le Future se termine.
  • Gérez la configuration et le nettoyage des tests en utilisant les callbacks setUp() et tearDown().
  • Si vous testez du code qui repose sur l'injection de dépendances, utilisez package:mockito aux côtés de package:test pour générer des objets mock, configurer des scénarios fixes et vérifier les interactions.

Exécuter les tests

Sélectionnez le bon test runner en fonction du type de projet et de l'emplacement des tests.

  • Si vous travaillez sur un projet Dart pur, exécutez les tests en utilisant la commande dart test.
  • Si vous travaillez sur un projet Flutter, exécutez les tests en utilisant la commande flutter test.
  • Si vous exécutez des tests d'intégration, spécifiez explicitement le chemin du répertoire, car le runner par défaut l'ignore : dart test integration_test ou flutter test integration_test.

Workflow d'implémentation des tests

Suivez ce workflow séquentiel lors de l'implémentation de nouvelles suites de test. Copiez la checklist pour suivre votre progression.

Progression des tâches

  • [ ] 1. Créez le fichier de test dans le répertoire test/, en vous assurant du suffixe _test.dart.
  • [ ] 2. Importez package:test/test.dart et la bibliothèque cible.
  • [ ] 3. Définissez une fonction main().
  • [ ] 4. Initialisez les ressources partagées ou les mocks en utilisant setUp().
  • [ ] 5. Écrivez les cas test() groupés par fonctionnalité en utilisant group().
  • [ ] 6. Exécutez la suite de test en utilisant la commande CLI appropriée.
  • [ ] 7. Boucle de rétroaction : Exécutez le test → Examinez la stack trace des échecs → Corrigez l'implémentation ou les assertions → Relancez jusqu'au succès.

Exemples

Suite de tests unitaires standard

Démontre le groupement, la configuration, les tests synchrones et asynchrones.

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 avec Mockito

Démontre la configuration d'un objet mock pour le test d'injection de dépendances.

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

// Générez le mock en utilisant 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 {
      // Configurez le mock
      when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');

      // Exécutez le système testé
      final result = await dataService.fetchData();

      // Vérifiez les résultats et les interactions
      expect(result.id, equals(1));
      verify(mockApiClient.get('/data')).called(1);
    });
  });
}

Skills similaires