首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【基于jinja2模版引擎自定义自动化测试报告模版】

【基于jinja2模版引擎自定义自动化测试报告模版】

原创
作者头像
用户10931828
修改2025-01-08 14:32:04
修改2025-01-08 14:32:04
27500
代码可运行
举报
文章被收录于专栏:接口测试接口测试
运行总次数:0
代码可运行

在自动化测试领域,虽然 Pytest 测试框架提供了多种现成的测试报告生成工具,如 Pytest-html 和 Allure,但这些工具可能无法完全满足特定的测试需求。本文将介绍一种自定义测试报告生成的方法,并提供相应的代码实现。通过这种方法,你可以根据项目的具体需求,灵活地定制测试报告的内容和格式,从而更有效地展示测试结果和分析数据。

一、环境准备

  1. Pytest 是一个功能强大的 Python 测试框架,它支持多种插件,能够轻松地与现有的测试代码集成。安装 Pytest 非常简单,只需运行以下命令
代码语言:javascript
代码运行次数:0
运行
复制
// An highlighted block

pip install pytest
  1. 安装 Jinja2

Jinja2 是一个用于 Python 的模板引擎,它允许我们将数据动态地插入到 HTML 模板中,从而生成个性化的 HTML 页面。安装 Jinja2 的命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
// An highlighted block

pip install Jinja2

二、创建 HTML 模板文件

在测试目录中创建一个名为 templates 的子目录,并在其中创建一个名为 A.html 的 HTML 模板文件。以下是模板文件的内容:

注意:需要测试报告中展示的内容在此处定义,如:用例执行时间、数据饼图、用例执行详情等

代码语言:javascript
代码运行次数:0
运行
复制
// templates/A.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>自动化测试报告</title>

    <style>

        /\* 在这里添加 CSS 样式 \*/

        body { font-family: Arial, sans-serif; }

        table { width: 100%; border-collapse: collapse; }

        th, td { border: 1px solid #ddd; padding: 8px; }

        th { background-color: #f2f2f2; }

        .canvas-container { width: 50%; margin: 20px auto; }

        canvas { max-width: 70%; height: auto !important; }

    </style>

</head>

<body>

    <h1>自动化测试报告</h1>

    <p>执行时间: {{ execution\_time }}</p>

    <p>用例总数: {{ total\_tests }}</p>

    <p>失败用例数: {{ failed\_tests }}</p>

    <div class="canvas-container">

        <canvas id="resultChart"></canvas>

    </div>

    <p>日志记录:</p>

    <pre>{{ log }}</pre>

    <table>

        <tr>

            <th>用例名称</th>

            <th>结果</th>

            <th>耗时</th>

        </tr>

        {% for test in tests %}

        <tr>

            <td>{{ test.name }}</td>

            <td>{{ test.result }}</td>

            <td>{{ test.duration }}</td>

        </tr>

        {% endfor %}

    </table>

    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

    <script>

        document.addEventListener('DOMContentLoaded', function() {

            var ctx = document.getElementById('resultChart').getContext('2d');

            var resultChart = new Chart(ctx, {

                type: 'pie',

                data: {

                    labels: ['通过', '失败'],

                    datasets: [{

                        label: '测试结果比例',

                        data: [{{ passed\_tests }}, {{ failed\_tests }}],

                        backgroundColor: [

                            'rgba(0, 128, 0, 0.2)', // 绿色

                            'rgba(255, 0, 0, 0.2)' // 红色

                        ],

                        borderColor: [

                            'rgba(0, 128, 0, 1)',

                            'rgba(255, 0, 0, 1)'

                        ],

                        borderWidth: 1

                    }]

                },

                options: {

                    responsive: true,

                    plugins: {

                        legend: {

                            position: 'top',

                        },

                    }

                }

            });

        });

    </script>

</body>

</html>

三、编写测试用例

首先,我们需要编写一些测试用例。假设我们有一个名为 test_demo.py 的文件,包含以下测试用例:

代码语言:javascript
代码运行次数:0
运行
复制
# test_demo.py

def test_example1():

    assert 1 + 1 == 2



def test_example2():

    assert 2 - 1 == 1

四、创建 conftest.py 文件

conftest.py 文件是 Pytest 的配置文件,我们可以在这里定义一些全局的 fixture 和钩子函数。以下是 conftest.py 文件的代码:

代码语言:javascript
代码运行次数:0
运行
复制
import os

import pytest

from jinja2 import Environment, FileSystemLoader



# 定义一个全局变量来收集测试结果

results = []





# pytest 钩子函数,用于在测试结束时收集结果

@pytest.hookimpl(tryfirst=True, hookwrapper=True)

def pytest_runtest_makereport(item, call):

    outcome = yield

    report = outcome.get_result()

    # print("\n测试结果:", report)

    if report.when == "call":

        # 根据测试结果添加到全局的 results 列表

        result = '通过' if report.outcome == "passed" else '失败'

        results.append({

            'name': item.name,

            'result': result,

            'duration': report.duration

        })





# pytest 钩子函数,用于在会话结束时生成报告

@pytest.hookimpl(tryfirst=True, hookwrapper=True)

def pytest_sessionfinish(session, exitstatus):

    yield

    # 确保使用的是全局的 results 列表

    generate_report(results)





# 定义生成报告的函数

def generate_report(results):

    print("开始生成报告...")

    # 计算通过和失败的用例数

    passed_tests = sum(1 for result in results if result['result'] == '通过')

    failed_tests = sum(1 for result in results if result['result'] == '失败')

    total_tests = len(results)

    execution_time = sum(result['duration'] for result in results)



    # 准备报告数据

    report_data = {

        'execution_time': execution_time,

        'total_tests': total_tests,

        'failed_tests': failed_tests,

        'passed_tests': passed_tests,

        'log': "这里是日志记录",

        'tests': results  # 使用全局的 results 列表

    }

    print(f"测试数据:{report_data}")

    # 使用 Jinja2 渲染报告模板

    template_path = os.path.join(os.path.dirname(__file__), 'templates')

    env = Environment(loader=FileSystemLoader(template_path))

    template = env.get_template('A.html')

    report_html = template.render(report_data)



    # 保存报告到文件

    with open('test_report.html', 'w') as f:

        f.write(report_html)



    # 打印报告已生成的消息

    print('测试报告已生成。')

五、运行测试并生成报告

在命令行中运行以下命令来执行测试用例并生成测试报告:

代码语言:javascript
代码运行次数:0
运行
复制
// 终端中执行如下命令

pytest -s  -vv test_demo.py

运行完成后,你将在当前目录下找到一个名为 test_report.html 的文件,它包含了根据 Jinja2 模板渲染的测试报告。报告中包括了测试结果的汇总信息、执行时间、用例条数、日志记录以及一个展示通过和失败用例比例的饼图。

执行报告如下:

六、总结

通过使用 Pytest 和 Jinja2,我们可以生成自定义的自动化测试报告,展示各种自己所需要的信息,不受已有插件的限制(如Pytest-html、allure等)

本文所实现的为一个demo,主要提供一种实现方法以及思路,具体的报告样式展示可由前端或者UI同学帮设计(更美观、专业),写法符合jinja2语法格式即可(即模版html中变量取值{{xxx}})

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档