coverage代码覆盖率测试工具:基本原理分析与使用

coverage环境描述

本文环境python3.5.2
coverage版本4.3.1

coverage概述

代码覆盖率工具主要是为了检查测试用例覆盖了多少业务处理代码,在Django项目中,通过编写的测试用例,来检查后端业务逻辑接口的逻辑覆盖程度,以达到全面测试,根据需要覆盖的重要的业务代码,从而提供测试用例的全面性,提高测试质量。

coverage的基本使用

首先我们先创建示例代码,代码如下:
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页面。此时页面如下:

coverage代码覆盖率测试工具:基本原理分析与使用_第1张图片

此时我们进一步点击test_file.py查看详细内容,如下图所示:

coverage代码覆盖率测试工具:基本原理分析与使用_第2张图片

此时,对比.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,执行分析完成脚本之后输出相关信息,然后根据该特性,我们自行编写了一个最简单的代码覆盖率检查的脚本,该脚本只是简单的打印出了脚本中所执行的代码的行号,大家可以基于该方法去扩写出其他功能。鉴于本人才疏学浅,如有疏漏请批评指正。

你可能感兴趣的:(python)