Migration de la suite de tests vers pytest, sans reecrire les scripts existants

pytest + pytest-qt (requirements-dev.txt) deviennent le point d'entree unique
de la suite ("pytest" depuis la racine), sans toucher aux 30+ scripts
test_*.py existants (convention deliberement conservee - voir tests/conftest.py) :
tests/test_all_scripts.py les lance chacun comme sous-processus isole (comme
c'etait deja fait manuellement a chaque phase), avec QT_QPA_PLATFORM=offscreen
pour tourner sans affichage (verifie : la suite complete passe a l'identique
en mode hors-ecran, prerequis pour une future integration continue).

tests/run_all.bat corrige au passage : il ne lancait plus que 4 tests sur 30+
(liste figee, jamais mise a jour au fil des phases) ; il delegue maintenant a
pytest.

Audit de couverture (Phase 13 du plan) : fingerprint, stockage atomique,
migration de schema, config OpenSSH, ProxyJump, CredentialStore, redaction de
secrets et detection de commandes dangereuses etaient deja couverts au fil des
phases precedentes. Seul point manquant identifie : aucun test ne verifiait
qu'une cle API IA ne puisse fuiter dans un message d'erreur - ajoute dans
tests/test_no_secrets_in_errors.py.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Florian
2026-09-05 07:32:55 +02:00
parent 0b2ff38bfd
commit 09b7ed092c
7 changed files with 164 additions and 12 deletions

50
tests/test_all_scripts.py Normal file
View File

@@ -0,0 +1,50 @@
"""Point d'entree pytest pour la suite : lance chaque tests/test_*.py existant
comme un sous-processus isole (voir conftest.py pour la raison de cet
isolement), avec les variables d'environnement necessaires sous Windows
(encodage UTF-8 pour les caracteres/emoji, rendu Qt hors-ecran pour tourner
sans affichage - typiquement en integration continue).
`pytest tests/` (ou simplement `pytest`) devient ainsi le point d'entree
unique de la suite, tout en preservant chaque script existant tel quel.
"""
from __future__ import annotations
import os
import subprocess
import sys
from pathlib import Path
import pytest
TESTS_DIR = Path(__file__).parent
PROJECT_ROOT = TESTS_DIR.parent
SCRIPTS = sorted(
p for p in TESTS_DIR.glob("test_*.py")
if p.name not in ("test_all_scripts.py",)
)
def _run_env() -> dict:
env = dict(os.environ)
env["PYTHONIOENCODING"] = "utf-8"
env["PYTHONUTF8"] = "1"
env.setdefault("QT_QPA_PLATFORM", "offscreen")
return env
@pytest.mark.parametrize("script", SCRIPTS, ids=lambda p: p.stem)
def test_script(script: Path) -> None:
result = subprocess.run(
[sys.executable, str(script)],
cwd=PROJECT_ROOT,
env=_run_env(),
capture_output=True,
text=True,
timeout=60,
)
if result.returncode != 0:
pytest.fail(
f"{script.name} a echoue (code {result.returncode}) :\n"
f"--- stdout ---\n{result.stdout}\n--- stderr ---\n{result.stderr}",
pytrace=False,
)