其他测试框架 关于 coverage combine 的疑问

卫青臣 · 2022年08月12日 · 最后由 卫青臣 回复于 2022年08月15日 · 6223 次阅读

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

最佳回复

研究了一下官方文档,有点难顶,不少地方不明白。原文:An existing combined data file is ignored and re-written,combine 的时候会忽视并重写.coverage。所以你只有子进程那份。我使用-a 去合并。报错了。Can't combine arc data with line data,这个和 coverage 的 Measuring sub-processes 相关。这后面要修改 sitecustomize.py 文件和配置.coveragerc 文件。关于排除覆盖用过.coveragerc 文件和 # pragma: no cover 这个注释可以排除

共收到 3 条回复 时间 点赞

不熟悉 python 的覆盖率方案,帮顶一下。

研究了一下官方文档,有点难顶,不少地方不明白。原文:An existing combined data file is ignored and re-written,combine 的时候会忽视并重写.coverage。所以你只有子进程那份。我使用-a 去合并。报错了。Can't combine arc data with line data,这个和 coverage 的 Measuring sub-processes 相关。这后面要修改 sitecustomize.py 文件和配置.coveragerc 文件。关于排除覆盖用过.coveragerc 文件和 # pragma: no cover 这个注释可以排除

落羽之梦 回复

试了一下,按照官方文档添加个 sitecustomize.py 文件:

import coverage
coverage.process_startup()

运行测试之后会两份数据,合并之后就可以统计到想要的数据了:

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册