Skip to content

feat: Watch Mode - Zero Startup Time test re-runs #76

@renaudcepre

Description

@renaudcepre

Objectif

Implémenter un mode "watch" qui garde Python chargé et les fixtures SESSION vivantes entre les runs, éliminant le temps de démarrage Python à chaque modification de fichier.

Valeur clé : Zero Startup Time - l'utilisateur sauvegarde, les tests tournent en ~10ms au lieu de 1-2s.

Contexte

pytest est conçu comme un script "One-Shot" : il démarre, exécute, meurt. Pour faire du watch avec pytest (pytest-watch), chaque sauvegarde relance un nouveau processus Python → réimporte tout → reconnecte la DB → lance le test. Résultat : 1-2s de latence même pour un petit test.

ProTest, grâce à son EventBus et sa boucle asyncio, peut fonctionner comme un serveur. Il reste en mémoire, les fixtures SESSION (DB, HTTP client) restent vivantes, et on ne relance que les fonctions de test.

Décisions d'Architecture

Aspect Décision
Rechargement Targeted Module Invalidation (del sys.modules[name])
Granularité Re-run TOUS les tests (MVP, pas de smart mapping)
Fixtures SESSION Teardown + recréer si leur fichier source change
Erreurs syntaxe Afficher l'erreur, attendre la prochaine modif

Structure Proposée

protest/watch/
├── __init__.py
├── runner.py      # WatchRunner - orchestrateur principal
├── watcher.py     # FileWatcher - détection async des changements (watchfiles)
├── reloader.py    # ModuleReloader - invalidation sys.modules
└── interrupt.py   # WatchInterruptHandler - gestion Ctrl+C simplifiée

CLI

protest run demo:session --watch
protest run demo:session -w --watch-paths ./src ./tests --debounce 300

Fichiers à Modifier

Fichier Action
protest/core/session.py Ajouter reset_for_rerun(), full_reload()
protest/di/container.py Ajouter clear_session_cache()
protest/execution/interrupt.py Ajouter reset()
protest/cli/main.py Ajouter --watch flags
protest/events/types.py Ajouter 5 nouveaux events (WATCH_STARTED, etc.)
protest/plugin.py Ajouter 5 hooks on_watch_*
pyproject.toml Ajouter watchfiles>=0.20 en optional dep

Ordre d'Implémentation

  1. Setup module watch + dépendance
  2. FileWatcher basique
  3. WatchInterruptHandler
  4. WatchRunner MVP (full reload chaque run) → Zero Startup Time
  5. CLI integration
  6. Tests MVP
  7. ModuleReloader (reload ciblé)
  8. Session.reset_for_rerun() (fixtures persistantes)
  9. FixtureContainer.clear_session_cache()
  10. InterruptHandler.reset()
  11. Watch Events
  12. Rich reporter watch display

Non-inclus dans MVP (Future)

  • Smart test selection (re-run seulement tests affectés)
  • Coverage-based dependency tracking (style testmon)
  • Clear screen entre runs
  • Sound notification on failure

Priorité

Post-v0 - Feature avancée pour différencier ProTest de pytest. Le core doit être stable avant.


📋 Plan détaillé disponible dans .claude/plans/snug-baking-leaf.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfutureFuture vision

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions