统计 Django 项目的测试覆盖率
- 2020 年 3 月 6 日
- 筆記
文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库
我们完成了对 blog 应用和 comment 应用这两个核心 app 的测试。现在我们想知道的是究竟测试效果怎么样呢?测试充分吗?测试全面吗?还有没有没有测到的地方呢?
单凭肉眼观察难以回答上面的问题,接下来我们就借助 Coverage.py,从代码覆盖率的角度来检测一下我们的测试效果究竟如何。
Coverage.py (以下简称 Coverage)是 Python 测试界最为流行的一个库之一,用来统计测试覆盖率。测试覆盖率可以从一个角度衡量代码的质量,覆盖率越高,说明测试越充分,代码出现 bug 的几率也就越小。当然需要注意的是,测试覆盖率仅仅只是衡量代码质量的一个角度,即使是 100% 的覆盖率也不能说代码就是完美的,没有 bug 的。
安装 Coverage
要使用 Coverage,首先当然是安装它:
$ pipenv install coverage --dev
因为只在开发时才用得到,所以使用 Pipenv 安装时加 –dev 选项将其标记为开发时的依赖库。
简单配置 Coverage
Coverage 支持很多配置选项,为了方便,通常将这些配置写在名为 .coveragerc
的文件中,Coverage 运行时会从项目根目录读取这个配置文件。因此先在项目根目录创建这个文件并写入最基本的配置:
[run] branch = True source = . [report] show_missing = True
Coverage 的配置遵循 ini 文件语法。简单来说就是,[section]
代表一个配置块,用于组织相关的一组配置。例如这里 [run]
是一个配置块,[report]
是另一个配置块,两个块下都有相关的一些配置项。
配置项的格式为 key = value
。
这几个简单配置项的含义为:
branch = True
。是否统计条件语句的分支覆盖情况。if 条件语句中的判断通常有 True 和 False 两种情况,设置branch = True
后,Coverage 会测量这两种情况是否都被测试到。source = .
。指定需统计的源代码目录,这里设置为当前目录(即项目根目录)。show_missing = True
。在生成的统计报告中显示未被测试覆盖到的代码行号。
运行 Coverage
简单配置后,我们就可以来运行 Coverage 了。
打开命令行,进入项目根目录,依次运行下面的命令(注意如果没有激活虚拟需使用 pipenv run 让命令在虚拟环境中执行)。
首先运行 erase 命令清除上一次的统计信息
$ pipenv run coverage erase
manage.py test 运行 django 单元测试,这是这一次用 coverage run 来运行
$ pipenv run coverage run manage.py test
生成覆盖率统计报告
$ pipenv run coverage report
覆盖率统计报告输出如下:
Name Stmts Miss Branch BrPart Cover Missing -------------------------------------------------------------------------------------------- _credentials.py 2 2 0 0 0% 1-2 blog__init__.py 0 0 0 0 100% blogadmin.py 11 0 0 0 100% blogapps.py 4 0 0 0 100% blogelasticsearch2_ik_backend.py 8 0 0 0 100% blogfeeds.py 12 0 0 0 100% blogmigrations