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:
50
tests/test_all_scripts.py
Normal file
50
tests/test_all_scripts.py
Normal 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,
|
||||
)
|
||||
Reference in New Issue
Block a user