Pytest提供了丰富的插件来扩展其功能,本章介绍下pytest-cov插件,用于生成测试覆盖率报告,帮助开发者了解哪些部分的代码被测试覆盖,哪些部分还需要进一步的测试。
pytest-cov 支持多种报告格式,包括纯文本、HTML、XML 等,开发者可以根据需要选择合适的报告格式。
并且可以配合之前文章介绍的pytest-xdist插件进行分布式测试。
官方文档:
https://pytest-cov.readthedocs.io/en/latest/index.html
适配版本说明:
python >= 3.6
pytest-cov安装
使用pip命令安装: pip install pytest-cov (安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看运行环境pycharm配置pytest运行环境)
通过pycharm安装:打开设置,按照如下图中安装插件(windows系统)
pytest-cov运行
使用时无需导入,直接在pytest运行命令中添加参数即可。主要有以下参数:
--cov=PATH:需要分析的代码路径。
--cov-report=type:要生成的报告类型:html,xml,json,lcov,term,term-missing等。
--cov-config=path覆盖范围的配置文件。默认.coveragerc。
--no-cov-on-fail:如果测试运行失败,不要报告覆盖范围。
--no-cov:完全禁用覆盖报告。
--cov-reset:重置迄今为止在选项中积累的cov源。
--cov-fail-under=MIN如果总覆盖率小于MIN,则失败。
--cov-append:结果附加到现有的数据文件中,而不是覆盖它。
--cov-branch启用分支覆盖。
--cov-context选择设置动态上下文的方法。
生成测试覆盖率报告
举例:我们的测试工程目录如下:src目录有两个python程序文件,testcase目录是测试用例。testcode.py和testclass.py中的内容如下:简单的比较函数
在test_case2.py文件中导入两个python模块,设计2条用例分别覆盖函数功能,通过参数化又不完全覆盖函数的所有代码。test_case_1传入2组参数,test_case_2传入1组参数。
import pytest
import sys
sys.path.append('..')
from src import testcode,testclass
@pytest.mark.parametrize('a,b',((1,1),(2,1)))
def test_case_1(a,b):
testcode.compare(a,b)
@pytest.mark.parametrize('a,b',((1,1),(3,3)))
def test_case_2(a,b):
testclass.testclass().compare(a,b)
在pytest执行语句中添加参数-cov=../src --cov-report=html,分析src目录的代码覆盖率,并生成html测试报告。
执行后默认在测试用例目录下创建htmlcov的目录,并生成html测试报告。
在浏览器下打开index.html报告,报告内容如下:
Files显示的是模块的覆盖率信息。
点击Functions查看函数覆盖率:
点击Classes查看类的覆盖率:
点进某个文件查看文件内的行覆盖详细信息:绿色表示覆盖,红色未覆盖
testclass文件:
testcode文件:
在一些大型的pytest工程中,用例很多,一般会使用分布式执行,比如开头提到的使用pytest-xdist插件的分布式执行功能,参数中添加-n 2可以起两个进程执行等。
其他参数的简要介绍
--no-cov-on-fail:如果测试运行失败,不要报告覆盖范围。
举例:设置用例会执行失败(比如上面的用例中加上assert False),当执行参数带上--no-cov-on-fail时,用例执行有失败时,就不会产生覆盖率报告。
--no-cov:完全禁用覆盖报告。
当执行命令加上该参数后,不会生成代码覆盖率报告。
--cov-fail-under=MIN如果总覆盖率小于MIN,则认为不达标。
举例:执行命令增加参数--cov-fail-under=90要求覆盖率不低于90%
当执行后结果如下:覆盖率不达标,会有报错信息。
--cov-context:当我们在多个执行用例时希望累积这些代码覆盖率时我们可以加上该参数--cov-context=test(参数设置其他值会报错)。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家。
---祝愿大家都能够龙腾虎跃,步步高升!!!