最近需要统计接口自动化的代码覆盖率,被测服务基于 Python 的 Flask 框架,所以想用 pycoverage 来统计覆盖率。
按照教程写了个 demo,发现 flask 启动时运行的代码,和我调接口时运行的代码,不能合并到一个覆盖率统计结果里

flask 服务代码如下:

from flask import Flask, request

app = Flask(__name__)

@app.route('/add_numb', methods=['GET', 'POST'])
def add_numb():
    a = float(request.args.get('a'))
    b = float(request.args.get('b'))
    return str(a + b)

@app.route('/division_numb')
def division_numb():
    a = float(request.args.get('a'))
    b = float(request.args.get('b'))
    return str(a / b)

def run():
    app.run(debug=False, port=9090)

启动服务和代码覆盖率统计的代码(cov.py):

import coverage

from main.service import run

if __name__ == '__main__':
    cov = coverage.Coverage(branch=True)
    cov.start()
    // 启动flask服务
    run()
    cov.stop()
    print("已停止")
    cov.save()
    print("结果已保存")
    cov.combine()
    print("结果已合并")
    cov.report(show_missing=True)
    print("已生成报告")
    ret = cov.html_report(directory='covhtml')
    print("已生成html报告", str(ret))

操作步骤:
1、使用coverage run -p cov.py来启动服务
2、调接口(接口测试)
3、ctrl + c停止服务,生成报告

测试结果:
统计到的代码覆盖率数据如图,是我测试的接口的代码:

因为加了-p参数启动,所以还生成了一个子进程的数据,从结果图可以看出是 flask 服务启动时覆盖的代码。该数据如图:

我的疑问:
1、cov.py 里调用了 coverage.combine 函数,但并没有合并到子进程的数据文件,另一份数据是在什么时候生成的,为什么不会被合并?

2、我尝试手动用 coverage combine 命令去合并两份数据文件,但合并之后统计结果只剩下子进程那份数据的覆盖率结果,是否可以让两份数据真正合并,统计 服务启动 + 接口测试 所覆盖到的代码?

3、代码覆盖率统计是否有必要统计服务启动时的代码?如果不必要的话,如何从覆盖率结果中排除?


↙↙↙阅读原文可查看相关链接,并与作者交流