Espace étudiants

Polytech Tours · Qualité, Test & Sécurité · 4A / 5A

TP Corpo Padel
Industrialiser la qualité

L'application existe et fonctionne. Votre mission n'est pas de la développer, c'est de challenger ses spécifications, l'éprouver par le test, et construire la chaîne CI/CD qui garantit sa qualité à chaque commit.

Groupes de 4 à 6 Vue 3 · FastAPI · Cypress · GitHub Actions

1 · Le contexte

Votre mission

L'association Corpo Padel organise des tournois de padel inter-entreprises. Elle s'est fait développer une application web (un frontend Vue 3, un backend FastAPI) par un prestataire pressé. L'application marche… en apparence.

Mais il n'existe aucun test, aucune chaîne d'intégration, et plusieurs anomalies ont déjà été remontées par les utilisateurs sans qu'on parvienne à les caractériser. Les spécifications, elles-mêmes, méritent un regard critique.

Votre équipe reprend le projet en tant qu'ingénieurs qualité. Vous n'écrirez aucune nouvelle fonctionnalité. Vous allez revoir les specs, éprouver l'application, prouver ses défauts, et la doter d'une chaîne CI/CD automatisée, exactement la démarche vue en cours.

Lien avec le cours. Ce TP applique directement les modules de CI/CD : portes de qualité, pyramide de tests, pipeline d'intégration, et la philosophie fondatrice, « si quelque chose fait mal, faites-le plus souvent ». Gardez le support de cours sous la main.

2 · Objectifs pédagogiques

Ce que vous saurez faire

3 · Déroulé du TP

Les 7 phases

Cliquez sur une phase pour la déplier. Les sept phases sont attendues de tous les groupes.

1
Revue des spécifications (Spec Review)
La première porte de qualité

Objectif

Tester commence avant d'exécuter la moindre ligne. Comprendre le besoin, et challenger les spécifications : sont-elles complètes, cohérentes, sans ambiguïté, et surtout testables ?

À faire

  • Lire intégralement le cahier des charges et identifier les exigences fonctionnelles, techniques et de sécurité.
  • Relever les ambiguïtés, incohérences et règles non testables (ex. une exigence sans critère d'acceptation mesurable).
  • Construire une matrice de traçabilité : à chaque exigence, associer le(s) cas de test qui la couvrira.
  • Distinguer recette interne (« avons-nous bien construit le produit ? ») et recette externe (« avons-nous construit le bon produit ? »).
Cette phase challenge les spécifications, pas l'implémentation. Les défauts du code, eux, se découvriront en phase 3.
Rapport de revue + matrice de traçabilité exigence → cas de test
2
Mise en place de l'environnement
Forker, installer, lancer

Objectif

Disposer d'un dépôt de groupe qui vous appartient (indispensable pour la CI) et d'une application qui tourne.

À faire

  • Forker le dépôt du starter kit vers le compte GitHub d'un membre (ou une organisation de groupe). Un simple clone local ne suffira pas pour la pipeline.
  • Cloner votre fork sur chaque poste, installer le backend (FastAPI) et le frontend (Vue) en suivant le README multi-OS.
  • Lancer le script de seed pour obtenir un jeu de données réaliste, puis démarrer les deux serveurs.
  • Se connecter avec le compte admin de test et explorer chaque page ; parcourir la doc d'API (/docs).
Fork du groupe opérationnel + app fonctionnelle sur tous les postes
3
Tests fonctionnels manuels & fiches d'anomalies
Le cœur de la démarche qualité

Objectif

Éprouver l'application à la main, de façon structurée, et caractériser chaque défaut. L'application contient des anomalies volontaires : à vous de les débusquer.

À faire

  • Rédiger un plan de test : périmètre, rôles testés (visiteur / joueur / admin), stratégie, jeux de données.
  • Construire un cahier de recette : pour chaque fonctionnalité, des cas de test (identifiant, pré-requis, étapes, donnée d'entrée, résultat attendu).
  • Exécuter les cas manuellement, consigner le résultat (OK / KO).
  • Pour chaque écart, rédiger une fiche d'anomalie complète (modèle en annexe A) : sévérité, étapes de reproduction, preuve.
  • Tester en priorité : validation des scores, dates d'événements, conflits de piste, règles de suppression, filtres par rôle, et le contrôle des accès.
Pensez aux cas limites et aux cas d'erreur, pas seulement au « chemin heureux ». Une validation se teste autant avec une donnée invalide qu'avec une donnée valide.
Plan de test + cahier de recette + fiches d'anomalies
4
Automatisation End-to-End : Cypress / Selenium
Du test manuel au test rejouable

Objectif

Transposer vos cas de recette manuels les plus importants en tests automatisés qui rejouent les parcours dans un vrai navigateur.

À faire

  • Configurer Cypress (déjà présent dans le projet), ou Selenium si votre groupe le préfère.
  • Écrire les tests des trois parcours : visiteur (accès limité), joueur (consultation), admin (création / modification).
  • Couvrir au moins : l'authentification (succès, échec, message d'erreur), la navigation par rôle, et une création d'entité côté admin.
  • Écrire au moins un test qui échoue à cause d'une anomalie détectée en phase 3, le test devient la preuve rejouable du défaut.
  • Organiser proprement : fixtures, commande custom de login.
Cypress vs Selenium. Cypress est déjà câblé et plus naturel pour cette SPA Vue ; c'est le chemin recommandé. Selenium (en Python) reste un choix cohérent si vous voulez rester dans l'écosystème de vos tests pytest.
Suite de tests E2E exécutable en local et en CI
5
Tests back-end & couverture : pytest
Tester l'API au plus près du code

Objectif

Tester directement l'API FastAPI, indépendamment du frontend, et mesurer la proportion de code réellement couverte.

À faire

  • Écrire des tests pytest sur les endpoints critiques : authentification, création de match / événement, validations, contrôle des rôles.
  • Tester les codes HTTP attendus (200, 201, 204, 400, 401, 403, 404, 409) et le contenu des réponses.
  • Couvrir les règles métier : validation de score, unicité de piste, dates, anti-brute force, expiration du token.
  • Mesurer la couverture avec pytest --cov et viser ≥ 70 % du code applicatif.
Suite pytest + rapport de couverture ≥ 70 %
6
Pipeline CI/CD : GitHub Actions
Automatiser les portes de qualité

Objectif

Construire un workflow qui exécute automatiquement vos tests à chaque modification, matérialisant les portes de qualité du cours. La procédure détaillée pas-à-pas est en annexe B.

À faire

  • Workflow GitHub Actions déclenché sur push et pull_request.
  • Étapes : installation → lint (flake8 / ESLint) → tests pytesttests E2E en mode headless.
  • La pipeline échoue si un test échoue (la porte bloque).
  • Badge de build affiché dans le README.
  • Quality gate chiffré : pipeline rouge si la couverture passe sous un seuil.
  • Branches protégées : main protégée, PR validée par la CI obligatoire avant merge.
  • Continuous Deployment : déploiement auto du frontend (GitHub Pages) sur merge vers main.
Workflow .github/workflows/ci.yml vert + badge
7
Rapport & restitution
Formaliser la démarche

Le rapport doit contenir

  • La synthèse de la revue de specs (ambiguïtés relevées, matrice de traçabilité).
  • La stratégie de test (pyramide, périmètre, priorisation) et sa justification.
  • La synthèse des anomalies (tableau récapitulatif + fiches en annexe).
  • La description de la pipeline : étapes, déclencheurs, portes de qualité, capture d'une exécution.
  • Le résultat de couverture et son interprétation.
  • Une lecture DORA : fréquence de déploiement, lead time, taux d'échec, temps de restauration.
  • Conclusion : limites, et ce que vous feriez avec plus de temps.
Rapport PDF (8 à 15 pages) à la racine du dépôt

4 · Un sujet, deux ambitions

Le sujet est identique pour tous les groupes. Il se joue sur deux axes complémentaires, l'un et l'autre attendus dans votre rendu.

Maîtriser la démarche de test

Challenger les spécifications, éprouver l'application à la main, formaliser chaque défaut en fiche d'anomalie, puis transposer vos cas de recette en tests automatisés. C'est ce qui établit si l'application fait, ou non, ce que le cahier des charges annonce.

Industrialiser la chaîne

Construire la pipeline qui rejoue tout automatiquement à chaque commit : lint, tests back-end, tests E2E, quality gate sur la couverture, branches protégées et déploiement continu. C'est ce qui garantit que la qualité tient dans le temps.

5 · Évaluation

Barème sur 20

CritèrePointsAttendu
Revue de specs & matrice de traçabilité2Ambiguïtés relevées, traçabilité exigence → test
Plan de test & cahier de recette2Structure, cas limites & cas d'erreur
Fiches d'anomalies2Complétude, reproductibilité, sévérité juste
Tests E2E (Cypress / Selenium)3Parcours visiteur / joueur / admin rejouables
Tests back-end pytest + couverture3Couverture ≥ 70 %, scénarios métier
Pipeline CI/CD fonctionnelle1.5Lint + tests sur push/PR, badge
Rapport0.5Clarté, lien avec le cours
Quality gate couverture1.5Pipeline rouge sous le seuil défini
Tests de sécurité OWASP2Contrôle d'accès, XSS, brute force, intégrés en CI
Déploiement continu1.5Déploiement auto sur merge vers main
Branches protégées & métriques DORA1PR obligatoire + lecture DORA argumentée
Important : Toute idée documentée, pertinente et justifiée en dehors du barème ci-dessus pourra donner lieu à des points bonus.

6 · Livrables

Ce que vous rendez

Un dépôt Git par groupe (votre fork), dont le lien est communiqué à l'enseignant avant la date limite. Organisation attendue :

corpo-padel/ # votre fork du starter kit
├── backend/
│ └── tests/ # vos tests pytest
├── frontend/
│ └── cypress/ # vos tests E2E
├── .github/
│ └── workflows/
│ └── ci.yml # votre pipeline
├── docs/
│ ├── revue-specs.md # rapport de revue + traçabilité
│ ├── plan-de-test.md # plan + cahier de recette
│ └── anomalies/ # vos fiches d'anomalies
├── rapport.pdf # rapport final
└── README.md # avec votre badge de build
Date limite : définie lors du TP. Tout commit postérieur ne sera pas pris en compte. L'historique Git fait partie de l'évaluation : committez régulièrement, avec des messages clairs.
Précision importante : Il est fortement conseillé de respecter les formats indiqués : .md ou .pdf;

Annexe A

Modèle de fiche d'anomalie

Chaque défaut donne lieu à une fiche au format suivant. Une fiche décrit un seul problème, assez précisément pour qu'un développeur le reproduise sans vous.

ChampContenu
IDANO-001, ANO-002…
TitreCourt et descriptif
TypeFonctionnel · Sécurité · IHM
SévéritéBloquant · Critique · Majeur · Mineur · Cosmétique
Module / endpointLa page ou la route concernée
EnvironnementNavigateur, OS, version testée
Pré-requisÉtat initial, compte utilisé (rôle)
Étapes de reproductionNumérotées, déterministes
Résultat attenduComportement correct selon le cahier des charges
Résultat obtenuComportement réellement observé
PreuveCapture, log, ou réponse API (corps + code HTTP)
Correction suggéréeOptionnel, hypothèse sur l'origine

Annexe B

Procédure : mettre en place la pipeline GitHub Actions

Construisez votre pipeline progressivement. Chaque étape est testable avant de passer à la suivante.

Pré-requis indispensable. GitHub Actions ne s'exécute que sur un dépôt que vous possédez. Vous devez avoir forké le starter kit (phase 2), un clone local seul ne déclenchera jamais de pipeline.

Créer le fichier de workflow

À la racine de votre dépôt, créez le fichier .github/workflows/ci.yml. GitHub détecte automatiquement tout fichier YAML dans ce dossier et le traite comme une pipeline.

Tests back-end

Premier job : lint + tests pytest sur l'API. Poussez ce fichier, puis vérifiez l'onglet Actions de votre dépôt : la pipeline doit se déclencher et passer au vert.

name: CI

on:
  push:
  pull_request:

jobs:
  backend:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: backend
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - name: Installer les dépendances
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install flake8 pytest pytest-cov
      - name: Lint (flake8)
        run: flake8 app --max-line-length=100
      - name: Tests + couverture
        run: pytest --cov=app --cov-report=term

Lint frontend + tests E2E

Second job : il faut que le backend ET le frontend tournent pendant les tests Cypress. On installe Python (pour servir l'API), on lance l'API en arrière-plan, puis l'action officielle Cypress démarre le frontend et attend que les deux soient prêts.

  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # --- Backend : servir l'API pendant les tests ---
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - name: Installer + démarrer l'API
        working-directory: backend
        run: |
          pip install -r requirements.txt
          python seed.py
          uvicorn app.main:app --port 8000 &
          # le '&' lance l'API en arrière-plan

      # --- Frontend + Cypress ---
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - name: Configurer l'URL de l'API
        working-directory: frontend
        run: echo "VITE_API_BASE_URL=http://localhost:8000/api/v1" > .env
      - name: Lint (ESLint)
        working-directory: frontend
        run: npm ci && npm run lint
      - name: Tests E2E Cypress
        uses: cypress-io/github-action@v6
        with:
          working-directory: frontend
          start: npm run dev
          wait-on: 'http://localhost:5173, http://localhost:8000/docs'
          wait-on-timeout: 120
À ce stade, la pipeline exécute lint + pytest + Cypress à chaque push. Si un test échoue, la pipeline passe au rouge : c'est votre porte de qualité automatisée.

Afficher le badge de build

En haut de votre README.md, ajoutez le badge (remplacez OWNER et REPO par les vôtres) :

![CI](https://github.com/OWNER/REPO/actions/workflows/ci.yml/badge.svg)

Quality gate sur la couverture

Faites échouer la pipeline si la couverture descend sous 70 %. Modifiez l'étape de test back-end :

      - name: Tests + quality gate
        run: pytest --cov=app --cov-fail-under=70

Protéger la branche main

Dans Settings → Branches → Add branch ruleset : exigez une pull request avant merge, et cochez « Require status checks to pass » en sélectionnant vos jobs backend et e2e. Plus aucun code ne rejoint main sans passer la CI.

C'est exactement le passage « changement normal → changement standard » du cours : la pipeline devient le contrôle.

Déploiement continu sur GitHub Pages

Ajoutez un job qui ne s'exécute que sur main et qui publie le frontend après le passage des tests :

  deploy:
    needs: [backend, e2e]
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    permissions:
      pages: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - name: Build du frontend
        working-directory: frontend
        run: npm ci && npm run build
      - uses: actions/upload-pages-artifact@v3
        with:
          path: frontend/dist
      - uses: actions/deploy-pages@v4
Note honnête. GitHub Pages ne déploie que le frontend statique ; l'API FastAPI nécessiterait un hébergeur séparé (Render, Railway…). Pour ce TP, ce déploiement démontre le mécanisme de Continuous Deployment, c'est l'objectif pédagogique.

Annexe C

Commandes utiles

# Back-end - tests & couverture (depuis backend/, venv activé)
pytest                                  # lancer les tests
pytest --cov=app --cov-report=term      # couverture console
pytest --cov=app --cov-report=html      # rapport HTML
pytest --cov=app --cov-fail-under=70    # avec quality gate

# Front-end - Cypress (depuis frontend/, back + front lancés)
npx cypress open                        # mode interactif
npx cypress run                         # mode headless (CI)

# Lint
flake8 app/                             # Python
npm run lint                            # Vue

# Git - bonne hygiène
git checkout -b feat/tests-auth         # une branche par lot de travail
git commit -m "test(auth): cas login KO" # messages clairs