DOC
Tester une app Flutter + audit OWASP Mobile
Mettre en place tests unitaires, widget et intégration en Flutter, puis auditer la sécurité OWASP Mobile Top 10
Tester une app Flutter + audit OWASP Mobile
Contexte
Vous avez une application Flutter en développement et vous voulez établir une couverture de test robuste (tests unitaires, widget, intégration) et auditer les risques de sécurité OWASP Mobile avant publication. Cette fiche guide l’utilisation des deux skills Flutter bundlés.
Prérequis
- Projet Flutter avec
flutter_testetpubspec.yaml - Skills Flutter installés via
./install.sh(bundlés par défaut)flutter-tester— tests Given-When-Thenowasp-mobile-security-checker— audit sécurité
- Dart 3.0+ et Flutter 3.10+
- Python 3 (pour scanners OWASP)
- Accès en lecture à la racine du projet
Étapes
1. Configuration des dépendances de test
Ajoutez à pubspec.yaml :
dev_dependencies:
flutter_test:
sdk: flutter
mockito: ^6.1.0
build_runner: ^2.4.0
Générez les mocks :
dart run build_runner build
2. Écrire tests unitaires (couche métier)
Créez test/repositories/user_repository_test.dart en utilisant le pattern Given-When-Then de flutter-tester :
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
@GenerateMocks([IUserDAO, IUserAPI])
void main() {
group('UserRepository', () {
group('fetchUsers', () {
setUp(() {
mockDAO = MockIUserDAO();
});
test('Given valid data, When fetchUsers called, Then returns list', () async {
when(mockDAO.fetchAll()).thenAnswer((_) async => [User(id: 1, name: 'Alice')]);
final result = await repository.fetchUsers();
expect(result.length, 1);
});
});
});
}
3. Écrire tests widget (couche UI)
Créez test/widgets/user_list_test.dart :
testWidgets('Given user list, When rendered, Then displays items', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: UserListWidget(),
),
);
expect(find.byType(ListTile), findsWidgets);
});
4. Scanner sécurité OWASP — M1 (secrets)
Exécutez depuis la racine du projet :
python3 ~/.claude/skills/flutter-tester/scripts/scan_hardcoded_secrets.py .
Résultat produit : owasp_m1_secrets_scan.json
{
"findings": [
{"file": "lib/config.dart", "line": 42, "secret_type": "API_KEY", "severity": "CRITICAL"}
]
}
5. Scanner sécurité OWASP — M2 (dépendances)
python3 ~/.claude/skills/flutter-tester/scripts/check_dependencies.py .
Analise les vulnérabilités CVE dans pubspec.yaml.
6. Scanner sécurité OWASP — M5 (réseau)
python3 ~/.claude/skills/flutter-tester/scripts/check_network_security.py .
Vérifie HTTPS, certificate pinning, Android Network Security Config.
7. Scanner sécurité OWASP — M9 (stockage)
python3 ~/.claude/skills/flutter-tester/scripts/analyze_storage_security.py .
Détecte SharedPreferences non chiffrées, fichiers en clair.
8. Couverture de test complète
flutter test --coverage
lcov --list coverage/lcov.info
Objectif minimum : 70% de couverture.
Exemple de sortie
=== Flutter Test Coverage ===
test/repositories/user_repository_test.dart .......................... PASS
test/widgets/user_list_test.dart .................................... PASS
Code coverage: 78%
=== OWASP Mobile Audit ===
M1 (Secrets) : 1 CRITICAL (API key hardcoded in config.dart:42)
M2 (Dependencies) : 0 ISSUES
M5 (Network) : 1 HIGH (HTTP endpoint detected in api_client.dart)
M9 (Storage) : 2 MEDIUM (SharedPreferences unencrypted)
Remediations:
[ ] Move API key to environment variables (config.dart:42)
[ ] Switch HTTP to HTTPS (api_client.dart:15)
[ ] Encrypt SharedPreferences with flutter_secure_storage
Variantes
- Variante A — Tests uniquement : Ignorer les scanners OWASP, focus sur unit/widget/intégration.
- Variante B — Audit sécurité rapide : Exécuter seulement M1 et M5, ignorer M2/M9.
- Variante C — Integration tests (E2E) : Ajouter
flutter_test/driverpour tester les flux complets. - Variante D — CI/CD : Intégrer dans GitHub Actions avec
flutter test && python3 scripts/*.py.
Agents enchaînés
Flux typique : community-skills-flutter → tests réussis → sargeras (45) audit complet → ed209 (52) sécurité approfondie.
Troubleshooting
| Symptôme | Cause probable | Résolution |
|---|---|---|
Mockito errors: no matching stubs | Mocks non générés | Exécuter dart run build_runner build |
flutter test timeout | Tests intégration trop lents | Ajouter timeout dans test() |
Python scanner not found | Skill Flutter mal installée | Vérifier ~/.claude/skills/flutter-tester/ |
CRITICAL findings in M9 | SharedPreferences non chiffré | Utiliser flutter_secure_storage |
Voir aussi
agents/docs/09-friday.md— générer contexte projetagents/audit/52-ed209.md— audit sécurité exhaustifagents/audit/45-sargeras.md— audit omniscient projet- Community skills :
community-skills/flutter/