假设我有一个像这样的 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.py
和 test_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/