Tester les applications Dart et Flutter
Sommaire
- Structurer les fichiers de test
- Écrire des tests
- Exécuter les tests
- Flux de travail pour l'implémentation des tests
- Exemples
Structurer les fichiers de test
Organisez les fichiers de test de manière à refléter la structure du répertoire lib pour garantir la prévisibilité.
- Placez tout le code de test dans le répertoire
testà la racine du paquet. - Ajoutez
_test.dartà la fin de tous les noms de fichiers de test (par exemple,lib/src/utils.dartdoit être testé danstest/src/utils_test.dart). - Si vous écrivez des tests d'intégration, placez-les dans un répertoire
integration_testà la racine du paquet.
Écrire des tests
Utilisez package:test comme bibliothèque de test standard pour les applications Dart.
- Importez
package:test/test.dart(oupackage:flutter_test/flutter_test.dartpour Flutter). - Regroupez les tests connexes à l'aide de la fonction
group()pour fournir un contexte partagé. - Définissez des cas de test individuels à l'aide de la fonction
test(). - Validez les résultats à l'aide de la fonction
expect()avec des comparateurs (par exemple,equals(),isTrue,throwsA()). - Écrivez des tests asynchrones en utilisant la syntaxe standard
async/await. Le lanceur de tests attend automatiquement la fin de laFuture. - Gérez la configuration et le nettoyage des tests à l'aide des callbacks
setUp()ettearDown(). - Si vous testez du code qui repose sur l'injection de dépendances, utilisez
package:mockitoavecpackage:testpour générer des objets simulés, configurer des scénarios fixes et vérifier les interactions.
Exécuter les tests
Sélectionnez le lanceur de tests approprié en fonction du type de projet et de l'emplacement des tests.
- Si vous travaillez sur un projet Dart pur, exécutez les tests à l'aide de la commande
dart test. - Si vous travaillez sur un projet Flutter, exécutez les tests à l'aide de la commande
flutter test. - Si vous exécutez des tests d'intégration, spécifiez explicitement le chemin du répertoire, car le lanceur par défaut l'ignore :
dart test integration_testouflutter test integration_test.
Flux de travail pour l'implémentation des tests
Suivez ce flux de travail séquentiel lors de l'implémentation de nouvelles suites de tests. Copiez la liste de contrôle pour suivre votre progression.
Progression des tâches
- 1. Créez le fichier de test dans le répertoire
test/, en veillant à utiliser le suffixe_test.dart. - 2. Importez
package:test/test.dartet la bibliothèque cible. - 3. Définissez une fonction
main(). - 4. Initialisez les ressources partagées ou les objets simulés à l'aide de
setUp(). - 5. Écrivez des cas de
test()regroupés par fonctionnalité à l'aide degroup(). - 6. Exécutez la suite de tests à l'aide de la commande CLI appropriée.
- 7. Boucle de rétroaction : Lancez le test -> Examinez la trace de la pile en cas d'échec -> Corrigez l'implémentation ou les assertions -> Relancez jusqu'à réussite.
Exemples
Suite de tests unitaires standard
Illustre le regroupement, 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
Montre comment configurer un objet simulé pour les tests 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 avec 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);
});
});
}