Skip to content

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_test et pubspec.yaml
  • Skills Flutter installés via ./install.sh (bundlés par défaut)
    • flutter-tester — tests Given-When-Then
    • owasp-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/driver pour 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ômeCause probableRésolution
Mockito errors: no matching stubsMocks non générésExécuter dart run build_runner build
flutter test timeoutTests intégration trop lentsAjouter timeout dans test()
Python scanner not foundSkill Flutter mal installéeVérifier ~/.claude/skills/flutter-tester/
CRITICAL findings in M9SharedPreferences non chiffréUtiliser flutter_secure_storage

Voir aussi

  • agents/docs/09-friday.md — générer contexte projet
  • agents/audit/52-ed209.md — audit sécurité exhaustif
  • agents/audit/45-sargeras.md — audit omniscient projet
  • Community skills : community-skills/flutter/