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>
51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""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,
|
|
)
|