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
主文件
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.py
和test_main.py
放在您选择的文件夹中并在同一文件夹中运行这些命令:
pip3 install coverage==5.1 pytest==6.1.2
coverage run --source main -m pytest && coverage report --show-missing
你应该得到与上面相同的结果。
推荐阅读
- flutter - Flutter 中带有 ListView 的 FAN 横幅
- docker - 使用 Wireguard 容器后面的端口绑定访问 Docker 容器
- python - 使用 OpenCV 和 Python 使用范围滑块(轨迹条)创建蒙版图像
- python - 如何在 Python 中用点覆盖水平条形图?
- bash - 复制(远程)某些文件夹
- c# - 如何在实体框架中的表中的两条记录之间建立关系
- html - 如何隐藏 form.errors 直到它处于活动状态
- kubernetes - Kubernetes UnexpectedAdmissionError : "kubelet_internal_checkpoint": mkdir /var: 文件存在,这是意外的
- c# - C# ASP MVC 路由模型 ID 错误
- arduino - arduino ESP8266 和 wemos d1 mini 出错