python - 如何在没有函数的脚本上使用 pytest

标签 python pytest

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

import pandas

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

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

最佳答案

您可以使用以下文件来测量具有全局执行代码的模块的覆盖率(我稍微简化了上面的示例,但是您也可以安装 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

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 以打印测试覆盖率。

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

> 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

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

关于python - 如何在没有函数的脚本上使用 pytest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67079136/

相关文章:

Python导入argv错误

python - 减去指定为字符串的两个时刻

python - 属性错误 : 'module' object has no attribute 'choice'

python - Pytest:只运行 linter 检查(pytest-flake8),不运行测试

python - 如何在 pytest 中为特定方法或函数定义设置和拆卸函数?

python - pytest 模拟函数但验证参数

python - 使用python-pptx检查powerpoint中的图像是否具有装饰性

python - 使用 pyparsing 将结果集转换为字典

python-3.x - PyTest: "no tests ran",即使测试已明确运行

pytest - 针对源代码或包运行测试