• 使用coverage工具统计python单元测试覆盖率


    使用coverage工具统计python单元测试覆盖率

     

    Coverage简介

    Coverage是一种用于统计Python代码覆盖率的工具,通过它可以检测测试代码对被测代码的覆盖率如何。Coverage支持分支覆盖率统计,可以生成HTML/XML报告。

    官方文档:http://coverage.readthedocs.org/en/latest/

    获取地址:http://pypi.python.org/pypi/coverage

    也可以通过easy_install或pip安装:easy_install coverage。

    安装后在Python27Scripts文件夹下生成coverage.exe等工具,在path中加环境变量C:Python27Scripts,便可以在命令行中调用coverage命令来进行覆盖率分析。

    Coverage使用

    1.命令行方式

    详见:http://coverage.readthedocs.io/en/latest/cmd.html

    可以使用help命令查看帮助:$ coverage help

    关键命令如下:

    A.run

    执行代码覆盖率统计,只需要通过coverage的run参数执行被统计代码即可。

    $ coverage run test.py arg1 arg2

    test.py是测试脚本,arg1 arg2是test.py执行需要的参数。跑完后,会自动生成一个覆盖率统计结果文件(data file):.coverage。

    B.report

    有了覆盖率统计结果文件,只需要再运行report参数,就可以在命令里看到统计的结果。

    clip_image001

    Stmts/Miss表示语句总数/未执行到的语句数

    Cover=(Stmts-Miss)/Stmts

    c. html

    生成html的测试报告。

    $ coverage html -d covhtml

    生成的报告直接关联代码,高亮显示覆盖和未覆盖的代码,支持排序。-d指定html文件夹。可以在这个地址预览一下:http://nedbatchelder.com/code/coverage/sample_html/

    效果如下:

    image

    测试文件:

    image

    高亮显示覆盖的和未覆盖的代码,覆盖的用绿色标示,未覆盖的用红色标示。

    注:coverage run test.py命令运行的文件,会统计项目中包括测试文件本身在内的所有文件,run参数的子参数—source可以指定要统计的文件:$ coverage run --source=totest.py test.py 可以只统计totest.py文件。

    d.combine

    合并多份覆盖率数据文件,把需要合并的覆盖率结果数据文件放在同一个目录里,然后执行coverage combine即可。但是对目录里的结果文件名的格式有要求,需要合并的文件必须有同样的前缀,然后后面跟一个名称(通常是机器名),然后再跟一个数字(通常是进程ID),比如:.coverage.75FEC5D4B3ADAAA.14632.213308

    为了方便执行结果的合并,我们在前面执行统计时,在run参数后面跟一个-p参数,会自动生成符合合并条件的结果文件。

    e.run参数的子参数1:--branch 统计分支覆盖率

    如果代码中的一个分支可能跳到一个以上的行,coverage.py会追踪每一个分支是否都有跳转到。

    $ coverage run --branch test.py

    clip_image006

    Branch/BrPart表示分支数/未执行到的分支数

    f.run参数的子参数2:--parallel-mode

    $ coverage run --parallel-mode test.py

    使Coverage监测被测代码子进程的覆盖率,如果被测代码是多进程的,如一些web程序等,必须使用此参数。

    2.API方式

    除了使用命令行,还可以在python代码中直接调用coverage模块执行代码覆盖率的统计。使用方法也非常简单:

    import coverage

    cov = coverage.coverage(source = ['totest'])

    cov.start()

    #coding

    cov.stop()

    cov.report()

    cov.html_report(directory='covhtml')

    source指定要执行统计的文件,source = ['totest']只统计totest.py的覆盖率

    directory指定生成html的路径

    使用Coverage统计web程序的覆盖率

    web程序一般是开启服务后循环监听消息,不会自动退出。而Coverage在实现上使用了atexit模块注册一个回调函数,在Python退出时将内存中的覆盖率结果写到文件中。被测脚本只有正常退出或者以SIGINT 2信号退出才能出发atexit,才能得到覆盖率结果。CTRL+C发的即是SIGINT 2信号,所以前台启动的服务用CTRL+C停止后可以出结果

  • 相关阅读:
    MySQL事务处理
    MySQL触发器
    MySQL游标
    MySQL存储过程
    MySQL视图
    MySQL创建和操纵表
    Java异常体系结构以及异常处理机制、自定义异常
    Java的面向对象和抽象类、接口、内部类以及OOP实战
    Java数组声明创建和使用以及多维数组、Arrays类、稀疏数组
    Java通过循环结构和switch实现简易计算器
  • 原文地址:https://www.cnblogs.com/Rvin/p/9273451.html
Copyright © 2020-2023  润新知