Le lanceur ne prenait que sept préfixes de noms, « le reste demandant une base de données » : les 3703 tests du répertoire passent avec PostgreSQL injoignable, et la suite n'en exécutait que 1131. Il balaie test/test_*.py. Deux formes rendent un fichier muet sans erreur : unittest.main() posé en plein milieu, qui sort avant que la seconde moitié soit définie (quatre fichiers, 87 tests), et l'absence de bloc __main__, qui compte zéro (huit fichiers, 174 tests). Une garde refuse ces deux formes et le retour d'une liste de préfixes. --- EN --- The runner took seven filename prefixes only, "the rest needing a database": all 3703 tests in the directory pass with PostgreSQL unreachable, and the suite ran 1131 of them. It now globs test/test_*.py. Two shapes make a file silent without error: unittest.main() placed mid-file, which exits before the second half is defined (four files, 87 tests), and no __main__ block at all, which counts zero (eight files, 174 tests). A guard now refuses both shapes and the return of a prefix list. Assisted-by: Claude Opus 5 (cherry picked from commit db71b333cc08ae0fce4ddaaf037357648b10236b)
85 lines
2.9 KiB
Bash
Executable file
85 lines
2.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
#
|
|
# Tests unitaires python du dépôt : ni base de données, ni Odoo, ni VM.
|
|
#
|
|
# Ils lisent le code et exécutent les fragments de shell que todo.py génère,
|
|
# avec « sudo », « pgrep » et « pkill » bouchonnés — c'est ce qui les rend
|
|
# lançables partout et en quelques secondes, là où « make test » demande une
|
|
# base et plusieurs minutes.
|
|
#
|
|
# DÉPENDANCE DÉCLARÉE : les tests du transfert mobile lisent
|
|
# mobile/erplibre_home_mobile. Absent, ils se disent ignorés plutôt que de
|
|
# passer en silence — un test vert sans son dépôt ne prouve rien. Ce script
|
|
# l'annonce donc avant de commencer.
|
|
#
|
|
# ./script/test/run_unit_test.sh [fichiers...]
|
|
#
|
|
# TOUT test/test_*.py, et non une liste de préfixes. La liste disait prendre
|
|
# test_qemu_, test_todo_, test_proxmox_… « le reste demandant une base de
|
|
# données ». Mesuré : les 3670 tests du répertoire passent avec PostgreSQL
|
|
# injoignable, et la liste laissait 2400 d'entre eux hors de la suite —
|
|
# écrits, verts, jamais lancés. Un glob n'oublie personne ; une liste, si.
|
|
#
|
|
# Un fichier n'est vu que s'il finit par le bloc habituel :
|
|
#
|
|
# if __name__ == "__main__":
|
|
# unittest.main()
|
|
#
|
|
# EN DERNIER, sinon tout ce qui suit est défini après l'appel et ne tourne
|
|
# jamais. C'est arrivé quatre fois ici, pour 87 tests.
|
|
set -uo pipefail
|
|
|
|
Red='\033[0;31m'
|
|
Green='\033[0;32m'
|
|
Yellow='\033[0;33m'
|
|
Color_Off='\033[0m'
|
|
|
|
cd "$(dirname "$0")/../.." || exit 1
|
|
|
|
PY=./.venv.erplibre/bin/python
|
|
if [[ ! -x "${PY}" ]]; then
|
|
echo -e "${Red}✗ ${PY} absent : lancer l'installation ERPLibre d'abord.${Color_Off}"
|
|
exit 1
|
|
fi
|
|
|
|
MOBILE=mobile/erplibre_home_mobile
|
|
if [[ -d "${MOBILE}" ]]; then
|
|
echo -e " dépendance ${MOBILE} : ${Green}présente${Color_Off}"
|
|
else
|
|
echo -e " dépendance ${MOBILE} : ${Yellow}absente${Color_Off}"
|
|
echo " (les tests du transfert mobile s'en passeront et le diront)"
|
|
fi
|
|
|
|
FILES=("$@")
|
|
if [[ ${#FILES[@]} -eq 0 ]]; then
|
|
# Aucun argument : tout le répertoire. Mesuré sans PostgreSQL.
|
|
mapfile -t FILES < <(ls test/test_*.py 2>/dev/null)
|
|
fi
|
|
|
|
fail=0
|
|
total=0
|
|
for f in "${FILES[@]}"; do
|
|
out=$(PYTHONPATH=. "${PY}" "${f}" 2>&1)
|
|
ran=$(echo "${out}" | grep -oE 'Ran [0-9]+' | grep -oE '[0-9]+' | tail -1)
|
|
skipped=$(echo "${out}" | grep -oE 'skipped=[0-9]+' | tail -1)
|
|
if echo "${out}" | grep -qE '^OK'; then
|
|
state="${Green}OK${Color_Off}"
|
|
else
|
|
state="${Red}ÉCHEC${Color_Off}"
|
|
fail=1
|
|
fi
|
|
total=$((total + ${ran:-0}))
|
|
printf " %-42s %5s tests %-14s %b\n" \
|
|
"$(basename "${f}")" "${ran:-?}" "${skipped:-}" "${state}"
|
|
[[ "${state}" == *"ÉCHEC"* ]] && echo "${out}" | tail -12
|
|
done
|
|
|
|
echo " ─────"
|
|
if [[ ${fail} -eq 0 ]]; then
|
|
echo -e " ${Green}${total} tests, tout vert${Color_Off}"
|
|
else
|
|
echo -e " ${Red}des échecs ci-dessus${Color_Off}"
|
|
fi
|
|
exit ${fail}
|