2 votes

Comment utiliser pytest sur un script sans fonctions

Disons que j'ai un script Python comme celui-ci :

import pandas

df = pd.read_csv('____')
if len(df) > 5:
    print('petit df')
else:
    print('grand df')

Ou tout autre script qui n'a pas de fonctions. Puis-je utiliser pytest ou une autre bibliothèque pour obtenir un fichier XML de couverture ? Tous les exemples que j'ai vus concernent des fonctions.

3voto

Lars Blumberg Points 1530

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X