Vous pouvez mesurer la couverture des modules avec du code exécuté globalement en utilisant les fichiers suivants (j'ai simplifié un peu votre exemple ci-dessus, mais vous pouvez également installer panda).
Comme je souhaite exécuter du code Python dans des conteneurs Docker, je liste tous les fichiers impliqués pour une configuration minimale. Après avoir placé tous les fichiers dans un dossier (nouveau), vous pouvez afficher la couverture des tests en utilisant la commande
make test-cov
Fichier Makefile
NOM_IMAGE := python-test-cov
build:
docker build -t ${NOM_IMAGE} .
test: build
docker run -t ${NOM_IMAGE} bash -c "python -m pytest -vv"
test-cov: build
docker run -t ${NOM_IMAGE} bash -c \
"coverage run --source main -m pytest && coverage report --show-missing"
Fichier Dockerfile
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py test_main.py ./
CMD python3 main.py
main.py
array = [1, 2, 3]
if len(array) < 5:
print('small array')
else:
print('large array')
test_main.py
def test_main(capfd):
import main
out, err = capfd.readouterr()
assert out == "small array\n"
requirements.txt
coverage==5.1
pytest==6.1.2
Comme mentionné ci-dessus, exécutez make test-cov
dans le même dossier où les fichiers sont stockés pour afficher la couverture des tests.
La sortie devrait être la suivante, indiquant que la ligne 6 de main.py
n'est pas couverte:
> make test-cov
============================ test session starts =============================
platform linux -- Python 3.9.4, pytest-6.1.2, py-1.10.0, pluggy-0.13.1
rootdir: /app
collected 1 item
test_main.py . [100%]
============================= 1 passed in 0.04s ==============================
Nom Instr Non couv Couv Manquant
---------------------------------------
main.py 4 1 75% 6
PS : Même si c'est une mauvaise pratique, si vous souhaitez exécuter l'exemple ci-dessus sans Docker et installer tous les modules globalement, il suffit de placer main.py
et test_main.py
dans un dossier de votre choix et d'exécuter ces commandes dans le même dossier :
pip3 install coverage==5.1 pytest==6.1.2
coverage run --source main -m pytest && coverage report --show-missing
Vous devriez obtenir le même résultat que ci-dessus.