Tests Unitaires
Ce dossier contient les tests unitaires pour l'application de gestion scolaire.
Structure des tests
tests/
├── __init__.py
├── conftest.py              # Configuration globale des tests
├── test_app.py             # Tests de l'application Flask
├── test_models.py          # Tests des modèles SQLAlchemy
├── test_forms.py           # Tests des formulaires WTForms
├── test_services.py        # Tests des services métier
├── test_routes_assessments.py  # Tests des routes d'évaluations
└── test_utils.py           # Tests des utilitaires
Exécution des tests
Avec uv (recommandé)
# Installer les dépendances de test
uv sync
# Exécuter tous les tests
uv run pytest tests/ -v
# Exécuter avec couverture de code
uv run pytest tests/ --cov=. --cov-report=html
# Exécuter des tests spécifiques
uv run pytest tests/test_models.py -v
uv run pytest tests/test_models.py::TestClassGroup -v
Avec le script personnalisé
# Tous les tests
uv run python run_tests.py
# Avec rapport de couverture
uv run python run_tests.py --coverage
# Tests d'un fichier spécifique
uv run python run_tests.py test_models.py
# Mode silencieux
uv run python run_tests.py --quiet
Configuration
Les tests utilisent:
- pytest comme framework de test
- pytest-flask pour l'intégration Flask
- pytest-cov pour la couverture de code
- SQLite en mémoire pour les tests de base de données
Couverture des tests
Les tests couvrent:
- ✅ Modèles SQLAlchemy (création, validation, relations)
- ✅ Configuration de l'application Flask
- ✅ Services métier (AssessmentService)
- ✅ Utilitaires (validation, gestion d'erreurs)
- ✅ Formulaires WTForms (validation)
- ✅ Routes principales (responses HTTP)
Bonnes pratiques
- Isolation: Chaque test utilise une base de données temporaire
- Fixtures: Configuration partagée dans conftest.py
- Nommage: Tests préfixés par test_
- Organisation: Tests groupés par classe selon la fonctionnalité
- Assertions: Vérifications claires et spécifiques
Ajout de nouveaux tests
Pour ajouter de nouveaux tests:
- Créer un fichier test_<module>.py
- Importer les fixtures nécessaires
- OU utiliser les fixtures existantes (app,client)
- Suivre la convention de nommage
Exemple:
def test_my_function(app):
    with app.app_context():
        # Votre test ici
        assert True