python工业互联网应用实战14——单元测试覆盖率
前面的章节我们完成了任务管理主要功能的开发及单元测试编写,可如何知道单元测试效果怎么样呢?测试充分吗?还有没有没有测到的地方呢?
本章节我们介绍一个统计测试代码覆盖率的利器Coverage,Coverage.py (以下简称 Coverage)是 Python 测试界最为流行的一个库之一,用来统计测试覆盖率。测试覆盖率可以从一个角度衡量代码的质量,覆盖率越高,说明测试越充分,代码出现 bug 的几率相对也就越小。当然需要明确的是,测试覆盖率仅仅只是衡量代码质量的一个角度,即是否有代码未经过单元测试验证,不能说100% 的覆盖率的代码就没有 bug 了。
1.1. 安装coverage
IDE Python环境管理里或进入命令行安装coverage,如下图:
1.2. 运行coverage
1.2.1. 工程目录下运行coverage run manage.py test
D:\my tfs\IndDemo>coverage run manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.............
----------------------------------------------------------------------
Ran 13 tests in 0.146s
OK
Destroying test database for alias 'default'...
D:\my tfs\IndDemo>
1.2.2. 查看统计结果coverage report
D:\my tfs\IndDemo>coverage report
Name Stmts Miss Cover
--------------------------------------------------------------------------------------
C:\Users\FQ\AppData\Roaming\Python\Python36\site-packages\six.py 490 242 51%
Collector\__init__.py 0 0 100%
Collector\admin.py 1 0 100%
Collector\migrations\__init__.py 0 0 100%
Collector\models.py 1 0 100%
Collector\tests.py 8 0 100%
Collector\views.py 93 72 23%
IndDemo\__init__.py 0 0 100%
IndDemo\settings.py 21 0 100%
IndDemo\urls.py 9 0 100%
Task\TaskBiz.py 27 5 81%
Task\__init__.py 1 0 100%
Task\admin.py 82 36 56%
Task\apps.py 4 0 100%
Task\migrations\0001_initial.py 7 0 100%
Task\migrations\0002_auto_20210314_0840.py 6 0 100%
Task\migrations\__init__.py 0 0 100%
Task\models.py 81 12 85%
Task\tests.py 78 0 100%
Task\urls.py 3 0 100%
Task\views.py 33 2 94%
TestStringMethods.py 9 1 89%
app\__init__.py 0 0 100%
app\forms.py 6 0 100%
app\migrations\__init__.py 0 0 100%
app\models.py 1 0 100%
app\tests.py 16 0 100%
app\views.py 12 0 100%
manage.py 10 2 80%
--------------------------------------------------------------------------------------
TOTAL 999 372 63%
D:\my tfs\IndDemo>
1.2.3. coverage html命令获得更加详细的信息
此命令在同级目录下生成包含html文件的文件夹,默认名称为htmlcov,点击打开index.html即可。
通过覆盖率统计,我们可以看到Task\views.py文件的代码覆盖率94%,有两行代码未被测试覆盖到,就可以通过点击相关链接查看详情,如下图:
有两行代码未被单元测试覆盖到,红色标注出来了非常方便查看未被覆盖额代码。
1.3. 修改单元测试代码
接下来我们增加单元测试代码,增加 self.client.get('/task/1/change/')测试get请求才能进入到上图标红的代码分支。
... def test_task_change(self):
data={'source':'111','target':'05-01-11'}
#更新第一个task的源和目标值
response=self.client.post('/task/1/change/',data) model = Task.objects.get(pk=1)
self.assertEqual(model.Source,'111')
self.assertEqual(model.Target,'05-01-11') response=self.client.get('/task/')
self.assertIn('111',response.content.decode())
self.assertTemplateUsed(response,'Task/tasks.html') response=self.client.get('/task/1/change/')
self.assertIn('111',response.content.decode())
self.assertTemplateUsed(response,'Task/taskChange.html')
重新运行代码覆盖命令:
D:\my tfs\IndDemo>coverage run manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.............
----------------------------------------------------------------------
Ran 13 tests in 0.212s
OK
Destroying test database for alias 'default'...
D:\my tfs\IndDemo>coverage html
刷新网页/htmlcov/index.html,我们得到如下图:
文件Task\views.py单元测试代码覆盖率达到了100%
1.4. 配置coverage
windows平台生成.coveragerc配置文件:
D:\my tfs\IndDemo>echo >.coveragerc
1.4.1. 基本配置
[run]
branch = True
source = .
[report]
show_missing = True
- branch = True。是否统计条件语句的分支覆盖情况。if 条件语句中的判断通常有 True 和 False 两种情况,设置 branch = True 后,Coverage 会测量这两种情况是否都被测试到。
- source = .。指定需统计的源代码目录,这里设置为当前目录(即项目根目录)。
- show_missing = True。在生成的统计报告中显示未被测试覆盖到的代码行号。
有一些文件其实并不需要测试,或者并非项目的核心文件(例如部署脚本 fabfile.py,django 的 migrations 文件等),这些文件应该从统计中排除。
Coverage 默认显示全部文件的覆盖率统计结果,如果文件比较多的话就不好查找非 100% 覆盖率的文件。毕竟我们的目标是提高代码覆盖率,因此已达 100% 覆盖的代码文件我们不再关心。我们要做的是找到非 100% 覆盖率的文件,为其添加缺失的测试。
1.4.2. 完善配置
在 [run] 配置块中增加 omit 配置项可以指定排除统计的文件。
在 [report] 配置块中增加 skip_covered 配置项可以指定统计报告中不显示 100% 覆盖的文件。
[run]
branch = True
source = .
omit =
*/__init__.py
manage.py
IndDemo/*
*/migrations/*
IndDemo/wsgi.py
[report]
show_missing = True
skip_covered = True
重新运行覆盖率
D:\my tfs\IndDemo>coverage run manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.............
----------------------------------------------------------------------
Ran 13 tests in 0.157s
OK
Destroying test database for alias 'default'...
D:\my tfs\IndDemo>coverage html
1.5. 小结
通过单元测试的代码覆盖率coverage工具,我们能够快速的定位到那些代码未经过单元测试覆盖到,从而实现单元测试精准的定位,确保覆盖到所有代码。虽然说经过单元测试的代码就没有bug,没有经过单元测试的代码隐藏的可能的bug概率会高得多。所以企业开发过程中引入单元测试和覆盖率肯定会给项目开发质量带来一个飞跃的提升!
这些都是深陷多个项目泥潭后,发现单元测试带来的好处。如果你和你团队也在做一个企业定制开发项目,组织编写单元测试吧,项目的中后期变更、扩展,你会发现编写单元测试的代价是多么的值得!
最新文章
- 【热文】 为什么很多硅谷工程师偏爱 OS X,而不是 Linux 或 Windows?
- Linux基础: 网络命令和进程管理
- 在jQuery EasyUI中实现对DataGrid进行编辑
- 3-Highcharts曲线图之显示点值折线图
- Qt之界面出现、消失动画效果(简单好用)
- 日常使用 Git 的 19 个建议
- SQL server 变量if,while,存储过程
- 《JS权威指南学习总结--8.6 函数闭包》
- Operation System
- Zabbix (三)
- MS-UAP发布的UWP的个人隐私策略
- LuoGu P1939 【模板】矩阵加速(数列)
- 第二天学习笔记:(MDN HTML学习、web安全策略与常见攻击、语义化)
- alias 创建别名
- 声笔飞码GB2312单字效率分析
- linux mutex
- HDU4622_Reincarnation
- 论 ArrayList如何实现线程安全
- mybatis mapper空指针异常的问题
- 【BZOJ4318】OSU! 期望DP
热门文章
- python3 多线程爬虫模板
- Java系列教程-Spring 教程目录
- Spring的循环依赖
- 极简实用的Asp.NetCore模块化框架决定免费开源了
- Nginx错误日志(error_log)配置及信息详解
- 经典变长指令ModR/M
- 【JVM进阶之路】十:JVM调优总结
- [Fundamental of Power Electronics]-PART I-2.稳态变换器原理分析-2.5/2.6 多极点滤波器电压纹波估计及要点小结
- 【设计模式】- 生成器模式(Builder)
- Java代码度量分析工具:DesigniteJava简介