提升质量:利用Coverage分析Python Web项目的测试覆盖

提升质量:利用Coverage分析Python Web项目的测试覆盖

鉴于不同框架的运行机制各有差异,当利用Coverage工具对Python Web项目的测试覆盖率进行分析时,必须采取针对性的方法来确保获取精确的测试覆盖率数据。以下是我针对Django框架与Flask框架在使用Coverage方面的详尽总结。

Django框架

首先,我们需要在manage.py文件中添加coverage模块的相关代码,以实现测试覆盖率的统计。具体步骤如下:

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
import coverage
import uuid


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'atcap.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)



if __name__ == '__main__':
    # 初始化coverage对象,自定义生成的结果文件
    cov = coverage.Coverage(data_file=f'.coverage.{str(uuid.uuid4())}')

    # 开始统计覆盖率
    cov.start()

    # 执行测试代码
    main()

    # 停止统计覆盖率
    cov.stop()

    # 生成覆盖率报告
    cov.report()

接下来,我们可以运行Django项目,并访问相关的接口以触发测试覆盖率的统计:

python manage.py runserver 0.0.0.0:8000

image

image

在访问完所需的接口后,使用Ctrl + C停止Django项目。请注意,由于coverage模块在实现上使用了atexit模块注册回调函数,在Python进程正常退出或以SIGINT(信号2)退出时,才会将内存中的覆盖率结果写入文件。因此,确保使用Ctrl + Ckill -2命令来停止项目,以避免覆盖率结果的丢失。

项目停止运行后,将在根目录下生成.coverage.*格式的结果文件。

image

为了生成统一的覆盖率报告,我们需要将这些结果文件合并为一个.coverage文件:

coverage combine

image

image

然后,使用以下命令在根目录下生成HTML格式的覆盖率报告:

coverage html

image

image

最后,通过访问htmlcov目录下的index.html文件,我们可以直观地查看项目的测试覆盖情况,并根据报告中的信息进行针对性的优化。

image

FastAPI框架

首先,我们需要在run.py文件中添加coverage模块的相关代码,以实现测试覆盖率的统计。具体步骤如下:

import uvicorn
import coverage

def run_coverage(app_module: str, app_name: str, host: str, port: int):
    # 初始化coverage对象,自定义生成的结果文件
    cov = coverage.Coverage()

    try:
        # 开始统计覆盖率
        cov.start()

        # 运行Uvicorn ASGI服务器
        uvicorn.run(f"{app_module}:{app_name}", host=host, port=port, reload=False, log_config="uvicorn_loggin_config.json")

    finally:
        # 停止统计覆盖率并保存数据
        cov.stop()
        cov.save()

if __name__ == "__main__":
    run_coverage("app", "app", "0.0.0.0", 9999)

接下来,我们可以运行FastAPI项目,并访问相关的接口以触发测试覆盖率的统计:

python run.py

image

在访问完所需的接口后,使用Ctrl + C停止Django项目。请注意,由于coverage模块在实现上使用了atexit模块注册回调函数,在Python进程正常退出或以SIGINT(信号2)退出时,才会将内存中的覆盖率结果写入文件。因此,确保使用Ctrl + Ckill -2命令来停止项目,以避免覆盖率结果的丢失。

项目停止运行后,将在根目录下生成.coverage结果文件。

image

然后,使用以下命令在根目录下生成HTML格式的覆盖率报告:

coverage html

image

最后,通过访问htmlcov目录下的index.html文件,我们可以直观地查看项目的测试覆盖情况,并根据报告中的信息进行针对性的优化。

image

Flask框架

首先,写一段基本的flask代码,如下:

from flask import Flask, request, jsonify


app = Flask(__name__)


@app.route('/hello', methods=['GET'])
def hello():
    res = {
        "meg": "hello",
        "code": 20000
    }
    return jsonify(res)

@app.route('/goodbye', methods=['GET'])
def goodbye():
    res = {
        "meg": "goodbye",
        "code": 20000
    }
    return jsonify(res)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

接下来,我们可以使用coverage命令运行flask框架,并访问相关的接口以触发测试覆盖率的统计:

coverage run --parallel-mode cov_falsk.py

image

image

在访问完所需的接口后,使用Ctrl + C停止Django项目。请注意,由于coverage模块在实现上使用了atexit模块注册回调函数,在Python进程正常退出或以SIGINT(信号2)退出时,才会将内存中的覆盖率结果写入文件。因此,确保使用Ctrl + Ckill -2命令来停止项目,以避免覆盖率结果的丢失。

项目停止运行后,将在根目录下生成.coverage.*格式的结果文件。

image

为了生成统一的覆盖率报告,我们需要将这些结果文件合并为一个.coverage文件:

coverage combine

image

image

然后,使用以下命令在根目录下生成HTML格式的覆盖率报告:

coverage html

image

image

最后,通过访问htmlcov目录下的index.html文件,我们可以直观地查看项目的测试覆盖情况,并根据报告中的信息进行针对性的优化。

image

posted @ 2024-10-15 16:21  测试小罡  阅读(192)  评论(1编辑  收藏  举报