本文环境python3.5.2
coverage版本4.3.1
代码覆盖率工具主要是为了检查测试用例覆盖了多少业务处理代码,在Django项目中,通过编写的测试用例,来检查后端业务逻辑接口的逻辑覆盖程度,以达到全面测试,根据需要覆盖的重要的业务代码,从而提供测试用例的全面性,提高测试质量。
首先我们先创建示例代码,代码如下:
import sys
import os
def test_a():
a = 1
def test_b():
b = 2
def run():
if 1:
r = 1
else:
r = 2
test_a()
ret = r
run()
此时,我们在终端中输入命令行;
coverage run test_file.py
命令输入完成后,在同级目录下就会生成一个.coverage的文件,该文件就包含了测试执行的时候的相关执行的输出信息;
!coverage.py: This is a private format, don't read it directly!{"lines":{"/Users/wuzi/workpy/eyaos_signature/server/test_file.py":[17,2,4,21,8,7,24,20,11,15]}}
该段信息主要记录了对应的文件,并记录了所执行的行数。此时我们可以进一步通过coverage提供的report命令来更直观的查看所执行的具体情况,此时在终端中输入:
coverage html -d html_test
此时就会生成一个html_test的文件夹,此时打开对应的html_test/index.html页面。此时页面如下:
此时我们进一步点击test_file.py查看详细内容,如下图所示:
此时,对比.coverage文件里面的内容,可知,标绿的行数都为记录的行数。coverage最基本的用法使用完成之后,我们具体实现一个自己的代码检查脚本。
为了实现coverage对应的功能,脚本需要知道执行的过程中,分一行都执行的位置,其本质就是需要知道在python脚本运行的时候能够调试该脚本,此时我们就联想到了Python提供的sys.settrace()函数,该函数就是设置系统的跟踪功能,允许您在Python中实现Python源代码调试器。 该函数是特定于线程的; 对于支持多线程的调试器,必须使用settrace()为每个正在调试的线程注册它。详细信息大家可以参考官方文档。
此时我们根据该思路编写代码;
import sys
def trace(frame, event, arg_unused):
if event == 'line':
print(frame.f_lineno, event, arg_unused)
return trace
sys.settrace(trace)
with open('test_file.py', "rb") as f:
source = f.read()
code = compile(source, 'test_file.py', 'exec')
exec(code)
通过编译和执行对应的test_file.py文件,使在运行的时候就通过注册的调试函数trace,然后输出和打印相关信息,此时终端的输出信息如下:
1 line None
3 line None
6 line None
10 line None
14 line None
23 line None
16 line None
19 line None
7 line None
20 line None
由该输出可知,输出的行号与我们使用coverage生成的.coverage中输出的行号是一致的,至此,简单的检查代码覆盖的脚本的最简单的执行思路就是如上所述,大家有兴趣可自行运行。
本文主要就是简单的使用了代码覆盖率检查工具coverage,执行分析完成脚本之后输出相关信息,然后根据该特性,我们自行编写了一个最简单的代码覆盖率检查的脚本,该脚本只是简单的打印出了脚本中所执行的代码的行号,大家可以基于该方法去扩写出其他功能。鉴于本人才疏学浅,如有疏漏请批评指正。