gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:45:21 26 4
gpt4 key购买 nike

假设我有一个这样的 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"
文件
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在与存储文件相同的文件夹中以打印测试覆盖率。
输出应该如下,说明 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com