首页 > 解决方案 > 如何在没有功能的脚本上使用 pytest

问题描述

假设我有一个这样的 Python 脚本:

import pandas

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

或者任何没有功能的脚本。我可以使用 pytest 或任何其他库来获取覆盖 xml 吗?我看到的所有示例都是针对函数的。

标签: pythonpytest

解决方案


您可以使用以下文件测量具有全局执行代码的模块覆盖率(我已经稍微简化了您上面的示例,但是您也可以安装 panda)。

由于我想在 Docker 容器中运行 Python 代码,因此我列出了所有涉及的文件以进行最小设置。将所有文件放入(新)文件夹后,您可以使用命令打印测试覆盖率

make test-cov

生成文件

IMAGE_NAME := python-test-cov

build:
    docker build -t ${IMAGE_NAME} .

test: build
    docker run -t ${IMAGE_NAME} bash -c "python -m pytest -vv"

test-cov: build
    docker run -t ${IMAGE_NAME} bash -c \
      "coverage run --source main -m pytest && coverage report --show-missing"

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

主文件

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"

要求.txt

coverage==5.1
pytest==6.1.2

如上所述,make test-cov在与存储文件相同的文件夹中运行以打印测试覆盖率。

输出应该如下,表示第 6 行main.py没有被覆盖:

> 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 ==============================
Name      Stmts   Miss  Cover   Missing
---------------------------------------
main.py       4      1    75%   6


PS:即使是不好的做法,如果您想在没有 Docker 的情况下运行上面的示例并全局安装所有模块,那么只需将main.pytest_main.py放在您选择的文件夹中并在同一文件夹中运行这些命令:

pip3 install coverage==5.1 pytest==6.1.2
coverage run --source main -m pytest && coverage report --show-missing

你应该得到与上面相同的结果。


推荐阅读