You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins中区分多被测单元的BDD Behave测试报告

问题解决:Behave多单元测试Jenkins报告区分显示

问题描述

为多个被测单元执行BDD Behave功能测试时,同一功能用例会重复运行。已通过修改behave.ini将报告保存到不同文件夹,但Jenkins中展示的报告名称重复(如TEST_F1),无法区分对应单元。期望实现两种效果之一:

  • Jenkins按文件夹结构展示报告
  • 报告名称改为TEST_F1_UNIT_1这类包含单元标识的格式

现有配置

behave.ini 配置

[behave]
default_tags = -@xfail -@wip
default_format = pretty
show_skipped = false
show_timings = true
stdout_capture = no
logging_level = ERROR
format = rerun
    progress3
    pretty
outputs = rerun.txt
    test_reports/progress3_report.txt
junit = true
junit_directory = test_reports/

Jenkinsfile 相关代码

stage('Run Tests')
{
    steps {
        stash includes: "**/*", name: "workspace"
        node("rpi") {
            script{
            unstash "workspace"
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
            sh """
                rm -rf test_reports
                python -m venv venv && . venv/bin/activate
                venv/bin/pip install --upgrade pip wheel
                venv/bin/pip install --upgrade -r BDD/requirements.txt
                python runner.py $units  
            """
            }
            }
            junit 'test_reports/**/*.xml'
        }
    }
}

解决方案

方案1:修改Behave报告的TestSuite名称(推荐)

通过Behave的钩子函数修改Feature名称,让生成的JUnit报告自带单元标识,Jenkins会自动区分不同单元的同名功能用例。

  1. 在BDD测试目录下创建environment.py文件,添加以下代码:
import os

def before_feature(context, feature):
    # 从环境变量获取当前测试的单元标识
    unit_id = os.getenv("TEST_UNIT_ID")
    if unit_id:
        # 给Feature名称追加单元标识
        feature.name = f"{feature.name}_UNIT_{unit_id}"
  1. 在runner.py中,为每个单元测试进程设置环境变量TEST_UNIT_ID。例如,遍历units列表时,运行Behave前注入环境变量:
import os
import subprocess

for unit in units:
    # 创建对应单元的报告目录
    unit_report_dir = f"test_reports/unit_{unit}"
    os.makedirs(unit_report_dir, exist_ok=True)
    
    # 设置环境变量并运行Behave
    env = os.environ.copy()
    env["TEST_UNIT_ID"] = str(unit)
    env["BEHAVE_JUNIT_DIRECTORY"] = unit_report_dir
    
    subprocess.run(
        ["venv/bin/behave"],
        env=env,
        check=True
    )

这样生成的JUnit报告中,TestSuite名称会变成TEST_F1_UNIT_1,Jenkins展示时会直接显示该名称,自动区分不同单元的测试结果。

方案2:重命名JUnit报告文件

如果不想修改Feature名称,可以在每个单元测试完成后,手动重命名生成的XML报告文件,追加单元标识。

在runner.py中,每个单元测试执行完成后添加重命名逻辑:

import os
import glob

for unit in units:
    unit_report_dir = f"test_reports/unit_{unit}"
    # 遍历当前单元目录下的所有JUnit报告
    for xml_path in glob.glob(os.path.join(unit_report_dir, "TEST_*.xml")):
        # 提取文件名并追加单元标识
        file_name = os.path.basename(xml_path)
        new_file_name = file_name.replace(".xml", f"_UNIT_{unit}.xml")
        new_xml_path = os.path.join(unit_report_dir, new_file_name)
        os.rename(xml_path, new_xml_path)

Jenkins扫描test_reports/**/*.xml时,会识别到不同名称的报告文件,展示为TEST_F1_UNIT_1、TEST_F1_UNIT_2等。

方案3:Jenkins按文件夹分组展示

如果希望保留原报告名称,仅通过文件夹结构区分,可以调整Jenkins的JUnit插件配置:

  1. 修改Jenkinsfile中的junit步骤,指定按子目录扫描:
junit(
    testResults: 'test_reports/*/*.xml',
    allowEmptyResults: true,
    keepLongStdio: true
)
  1. 在Jenkins的测试结果页面,点击左侧的「分组」按钮,选择「按目录分组」,即可看到不同单元文件夹下的报告被分组展示。

内容的提问来源于stack exchange,提问作者MAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:45:52