最近需要统计接口自动化的代码覆盖率,被测服务基于 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、代码覆盖率统计是否有必要统计服务启动时的代码?如果不必要的话,如何从覆盖率结果中排除?