本篇承接上一篇 Python测试框架之—— pytest介绍与示例,在此基础上介绍如何基于pytest进行测试的覆盖率统计。
要在使用 pytest
进行测试时检测代码覆盖率,可以使用 pytest-cov
插件。这个插件是基于 coverage.py
,它能帮助你了解哪些代码部分被测试覆盖到,哪些没有。
安装 pytest-cov
首先,需要安装 pytest-cov
。可以使用 pip
来安装:
pip install pytest-cov
运行测试并生成覆盖率报告
安装完 pytest-cov
后,可以通过在 pytest
命令中加入 --cov
参数来启用覆盖率统计。以下是一些常见的用法:
-
生成覆盖率报告
运行整个测试套件,并对整个项目生成覆盖率报告:
pytest --cov=my_project
这里
my_project
应该替换成包或模块的名字。这将显示命令行中的覆盖率概要。 -
生成覆盖率报告,并指定覆盖哪些文件
如果只想检查特定模块的覆盖率:
pytest --cov=my_project.module tests/
-
生成 HTML 覆盖率报告
如果想生成一个详细的 HTML 覆盖率报告,可以添加
--cov-report
选项:pytest --cov=my_project --cov-report=html
这将在当前目录下的
htmlcov/
文件夹中创建一个 HTML 报告。
配置文件 pytest.ini
对于更复杂的项目,可以通过修改 pytest.ini
(或其他 Pytest 配置文件)来自定义覆盖率参数。例如:
# pytest.ini
[pytest]
addopts = --cov=my_project --cov-report=term-missing
这里的 --cov-report=term-missing
将在终端中显示哪些行没有被测试覆盖。
清晰可见的覆盖率报告
覆盖率报告有助于指导测试的编写。通过查看哪些代码行没有被测试覆盖,开发者可以决定是否需要添加更多的测试用例或调整现有的测试。
生成的 HTML 报告非常详细,列出了每个文件的行覆盖率,并高亮显示未被覆盖的代码行,非常适合进行深入分析。
通过这种方式,使用 pytest-cov
不仅可以帮助保证代码质量,还可以确保软件的可靠性和维护性。
产生的测试报告的格式如下:
Name Stmts Miss Cover
---------------------------------
module1.py 50 5 90%
module2.py 100 20 80%
---------------------------------
TOTAL 150 25 83%
这个摘要告诉我们module1.py
有50条语句,其中5条没有在测试中执行;module2.py
有100条语句,20条没有执行。整个项目的总覆盖率是83%,意味着大约83%的代码语句在测试中被执行了。
Stmts 代表的含义
在代码覆盖率报告中,“Stmts” 代表“Statements”的缩写,意思是“语句”。在编程中,一个语句是指一条执行的指令,它告诉计算机做些什么,比如赋值、调用函数、循环等。在覆盖率测试的上下文中,Stmts 数量指的是程序中所有可能执行的独立语句的总数。
覆盖率报告通常会包括几个关键指标:
- Total Stmts:程序中所有语句的总数。
- Miss Stmts:在测试运行期间没有被执行的语句数量。
- Cover Stmts:在测试运行期间被执行的语句数量。
- Coverage:覆盖率的百分比,计算方式通常是
(Cover Stmts / Total Stmts) * 100%
。覆盖率越高,表明你的测试越有可能覆盖到代码的各个部分。
报告中的这个指标可以帮助开发者理解他们的测试覆盖到代码的哪些部分,以及哪些部分没有被覆盖到。理想情况下,你希望测试能够覆盖尽可能多的语句,以确保代码的各个分支都经过了测试,从而提高软件质量和可靠性。
实际示例注意
project/
├── src/
│ ├── module1.py
│ └── module2.py
└── tests/
├── test_module1.py
└── test_module2.py
在上一篇的项目结构中, 如果在project 目录下运行 pytest --cov
, 则源码和测试代码都会被统计测试覆盖率, 如下图:
如果只需要统计源码的测试覆盖率,则执行语句 pytest --cov=src