Test des applications Dart et Flutter
Contenu
- Structurer les fichiers de test
- Écrire des tests
- Exécuter les tests
- Workflow d'implémentation des tests
- Exemples
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.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 package.
É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). - 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 leFuturese termine. - Gérez la configuration et le nettoyage des tests en utilisant les callbacks
setUp()ettearDown(). - Si vous testez du code qui repose sur l'injection de dépendances, utilisez
package:mockitoaux côtés depackage:testpour 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_testouflutter 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.dartet 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 utilisantgroup(). - [ ] 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);
});
});
}