Refactoring
This commit is contained in:
287
unionflow-mobile-apps/scripts/run_tests.dart
Normal file
287
unionflow-mobile-apps/scripts/run_tests.dart
Normal file
@@ -0,0 +1,287 @@
|
||||
#!/usr/bin/env dart
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
/// Script pour exécuter tous les tests du module solidarité
|
||||
///
|
||||
/// Ce script automatise l'exécution des tests avec génération
|
||||
/// de rapports de couverture et de métriques de qualité.
|
||||
void main(List<String> arguments) async {
|
||||
print('🧪 Démarrage des tests du module Solidarité...\n');
|
||||
|
||||
// Configuration des options de test
|
||||
final bool verbose = arguments.contains('--verbose') || arguments.contains('-v');
|
||||
final bool coverage = arguments.contains('--coverage') || arguments.contains('-c');
|
||||
final bool integration = arguments.contains('--integration') || arguments.contains('-i');
|
||||
final String? specific = _getSpecificTest(arguments);
|
||||
|
||||
try {
|
||||
// 1. Vérification de l'environnement
|
||||
await _checkEnvironment();
|
||||
|
||||
// 2. Génération des mocks si nécessaire
|
||||
await _generateMocks();
|
||||
|
||||
// 3. Exécution des tests unitaires
|
||||
if (specific == null || specific == 'unit') {
|
||||
await _runUnitTests(verbose: verbose, coverage: coverage);
|
||||
}
|
||||
|
||||
// 4. Exécution des tests d'intégration
|
||||
if (integration && (specific == null || specific == 'integration')) {
|
||||
await _runIntegrationTests(verbose: verbose);
|
||||
}
|
||||
|
||||
// 5. Exécution des tests de widgets
|
||||
if (specific == null || specific == 'widget') {
|
||||
await _runWidgetTests(verbose: verbose, coverage: coverage);
|
||||
}
|
||||
|
||||
// 6. Génération du rapport de couverture
|
||||
if (coverage) {
|
||||
await _generateCoverageReport();
|
||||
}
|
||||
|
||||
// 7. Analyse de la qualité du code
|
||||
await _runCodeAnalysis();
|
||||
|
||||
print('\n✅ Tous les tests ont été exécutés avec succès !');
|
||||
_printSummary();
|
||||
|
||||
} catch (e) {
|
||||
print('\n❌ Erreur lors de l\'exécution des tests: $e');
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/// Vérifie que l'environnement de test est correctement configuré
|
||||
Future<void> _checkEnvironment() async {
|
||||
print('🔍 Vérification de l\'environnement...');
|
||||
|
||||
// Vérifier que Flutter est installé
|
||||
final flutterResult = await Process.run('flutter', ['--version']);
|
||||
if (flutterResult.exitCode != 0) {
|
||||
throw Exception('Flutter n\'est pas installé ou accessible');
|
||||
}
|
||||
|
||||
// Vérifier que les dépendances sont installées
|
||||
final pubResult = await Process.run('flutter', ['pub', 'get']);
|
||||
if (pubResult.exitCode != 0) {
|
||||
throw Exception('Erreur lors de l\'installation des dépendances');
|
||||
}
|
||||
|
||||
print('✅ Environnement vérifié');
|
||||
}
|
||||
|
||||
/// Génère les mocks nécessaires pour les tests
|
||||
Future<void> _generateMocks() async {
|
||||
print('🔧 Génération des mocks...');
|
||||
|
||||
final result = await Process.run('flutter', [
|
||||
'packages',
|
||||
'pub',
|
||||
'run',
|
||||
'build_runner',
|
||||
'build',
|
||||
'--delete-conflicting-outputs'
|
||||
]);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
print('⚠️ Avertissement: Erreur lors de la génération des mocks');
|
||||
print(result.stderr);
|
||||
} else {
|
||||
print('✅ Mocks générés');
|
||||
}
|
||||
}
|
||||
|
||||
/// Exécute les tests unitaires
|
||||
Future<void> _runUnitTests({bool verbose = false, bool coverage = false}) async {
|
||||
print('🧪 Exécution des tests unitaires...');
|
||||
|
||||
final args = ['test'];
|
||||
|
||||
if (coverage) {
|
||||
args.add('--coverage');
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
args.add('--reporter=expanded');
|
||||
}
|
||||
|
||||
// Tests spécifiques au module solidarité
|
||||
args.addAll([
|
||||
'test/features/solidarite/domain/',
|
||||
'test/features/solidarite/data/',
|
||||
'test/features/solidarite/presentation/bloc/',
|
||||
]);
|
||||
|
||||
final result = await Process.run('flutter', args);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
print('❌ Échec des tests unitaires');
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
throw Exception('Tests unitaires échoués');
|
||||
}
|
||||
|
||||
print('✅ Tests unitaires réussis');
|
||||
}
|
||||
|
||||
/// Exécute les tests d'intégration
|
||||
Future<void> _runIntegrationTests({bool verbose = false}) async {
|
||||
print('🔗 Exécution des tests d\'intégration...');
|
||||
|
||||
final args = ['test'];
|
||||
|
||||
if (verbose) {
|
||||
args.add('--reporter=expanded');
|
||||
}
|
||||
|
||||
args.add('integration_test/');
|
||||
|
||||
final result = await Process.run('flutter', args);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
print('❌ Échec des tests d\'intégration');
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
throw Exception('Tests d\'intégration échoués');
|
||||
}
|
||||
|
||||
print('✅ Tests d\'intégration réussis');
|
||||
}
|
||||
|
||||
/// Exécute les tests de widgets
|
||||
Future<void> _runWidgetTests({bool verbose = false, bool coverage = false}) async {
|
||||
print('🎨 Exécution des tests de widgets...');
|
||||
|
||||
final args = ['test'];
|
||||
|
||||
if (coverage) {
|
||||
args.add('--coverage');
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
args.add('--reporter=expanded');
|
||||
}
|
||||
|
||||
args.add('test/features/solidarite/presentation/widgets/');
|
||||
|
||||
final result = await Process.run('flutter', args);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
print('❌ Échec des tests de widgets');
|
||||
print(result.stdout);
|
||||
print(result.stderr);
|
||||
throw Exception('Tests de widgets échoués');
|
||||
}
|
||||
|
||||
print('✅ Tests de widgets réussis');
|
||||
}
|
||||
|
||||
/// Génère le rapport de couverture
|
||||
Future<void> _generateCoverageReport() async {
|
||||
print('📊 Génération du rapport de couverture...');
|
||||
|
||||
// Installer lcov si nécessaire (sur Linux/macOS)
|
||||
if (Platform.isLinux || Platform.isMacOS) {
|
||||
final lcovResult = await Process.run('which', ['lcov']);
|
||||
if (lcovResult.exitCode != 0) {
|
||||
print('⚠️ lcov n\'est pas installé. Installation recommandée pour les rapports HTML.');
|
||||
} else {
|
||||
// Générer le rapport HTML
|
||||
await Process.run('genhtml', [
|
||||
'coverage/lcov.info',
|
||||
'-o',
|
||||
'coverage/html',
|
||||
'--title',
|
||||
'UnionFlow Solidarité - Couverture de tests'
|
||||
]);
|
||||
print('📊 Rapport HTML généré dans coverage/html/');
|
||||
}
|
||||
}
|
||||
|
||||
// Afficher les statistiques de couverture
|
||||
final coverageFile = File('coverage/lcov.info');
|
||||
if (coverageFile.existsSync()) {
|
||||
final content = await coverageFile.readAsString();
|
||||
final lines = content.split('\n');
|
||||
|
||||
int totalLines = 0;
|
||||
int coveredLines = 0;
|
||||
|
||||
for (final line in lines) {
|
||||
if (line.startsWith('LF:')) {
|
||||
totalLines += int.parse(line.substring(3));
|
||||
} else if (line.startsWith('LH:')) {
|
||||
coveredLines += int.parse(line.substring(3));
|
||||
}
|
||||
}
|
||||
|
||||
if (totalLines > 0) {
|
||||
final percentage = (coveredLines / totalLines * 100).toStringAsFixed(1);
|
||||
print('📊 Couverture: $coveredLines/$totalLines lignes ($percentage%)');
|
||||
}
|
||||
}
|
||||
|
||||
print('✅ Rapport de couverture généré');
|
||||
}
|
||||
|
||||
/// Exécute l'analyse de la qualité du code
|
||||
Future<void> _runCodeAnalysis() async {
|
||||
print('🔍 Analyse de la qualité du code...');
|
||||
|
||||
final result = await Process.run('flutter', ['analyze', '--fatal-infos']);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
print('⚠️ Problèmes détectés lors de l\'analyse:');
|
||||
print(result.stdout);
|
||||
} else {
|
||||
print('✅ Aucun problème détecté');
|
||||
}
|
||||
}
|
||||
|
||||
/// Affiche un résumé des résultats
|
||||
void _printSummary() {
|
||||
print('\n📋 RÉSUMÉ DES TESTS');
|
||||
print('==================');
|
||||
print('✅ Tests unitaires: RÉUSSIS');
|
||||
print('✅ Tests de widgets: RÉUSSIS');
|
||||
print('✅ Analyse de code: TERMINÉE');
|
||||
print('');
|
||||
print('📁 Fichiers générés:');
|
||||
print(' - coverage/lcov.info (données de couverture)');
|
||||
print(' - coverage/html/ (rapport HTML)');
|
||||
print('');
|
||||
print('🚀 Le module Solidarité est prêt pour la production !');
|
||||
}
|
||||
|
||||
/// Extrait le type de test spécifique des arguments
|
||||
String? _getSpecificTest(List<String> arguments) {
|
||||
for (int i = 0; i < arguments.length; i++) {
|
||||
if (arguments[i] == '--test' || arguments[i] == '-t') {
|
||||
if (i + 1 < arguments.length) {
|
||||
return arguments[i + 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Affiche l'aide
|
||||
void _printHelp() {
|
||||
print('Usage: dart run_tests.dart [options]');
|
||||
print('');
|
||||
print('Options:');
|
||||
print(' -v, --verbose Affichage détaillé des tests');
|
||||
print(' -c, --coverage Génération du rapport de couverture');
|
||||
print(' -i, --integration Exécution des tests d\'intégration');
|
||||
print(' -t, --test TYPE Exécution d\'un type spécifique (unit|widget|integration)');
|
||||
print(' -h, --help Affichage de cette aide');
|
||||
print('');
|
||||
print('Exemples:');
|
||||
print(' dart run_tests.dart # Tous les tests');
|
||||
print(' dart run_tests.dart -c # Avec couverture');
|
||||
print(' dart run_tests.dart -t unit # Tests unitaires seulement');
|
||||
print(' dart run_tests.dart -v -c -i # Tous les tests avec détails');
|
||||
}
|
||||
Reference in New Issue
Block a user