如何在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会自动区分不同单元的同名功能用例。
- 在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}"
- 在
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插件配置:
- 修改Jenkinsfile中的
junit步骤,指定按子目录扫描:
junit( testResults: 'test_reports/*/*.xml', allowEmptyResults: true, keepLongStdio: true )
- 在Jenkins的测试结果页面,点击左侧的「分组」按钮,选择「按目录分组」,即可看到不同单元文件夹下的报告被分组展示。
内容的提问来源于stack exchange,提问作者MAR
相关产品推荐
相关产品推荐

