CircleCI按耗时拆分测试时无法读取Behave生成的JUnit XML文件
问题原因
CircleCI 按测试耗时拆分并行任务的核心逻辑,是匹配历史上传的 JUnit 报告中 classname 字段值,和当前拆分时传入的测试文件标识做关联。Behave 框架默认生成的 JUnit 报告,classname 字段仅填充 Feature 名称,不带 .feature 文件的完整相对路径,和你通过 circleci tests glob 拿到的 features/featurefiles/XXX.feature 路径完全无法匹配,因此会抛出「No timing found」报错,回退到按文件名拆分的默认逻辑。
配置步骤
- 安装支持自定义 JUnit 字段格式的 Behave 插件
Behave 原生 JUnit 导出器不支持自定义classname规则,需要替换为behave-junit-formatter。在依赖安装步骤执行安装命令,或者直接把包加入requirements.txt:pip3 install behave-junit-formatter - 配置 Behave 输出符合 CircleCI 匹配规则的 JUnit 报告
在项目根目录新建behave.ini配置文件,指定 JUnit 输出路径,以及classname字段直接输出 feature 文件的相对路径,和 glob 拿到的文件路径保持完全一致:[behave] junit_directory = reports formatters = behave_junit_formatter:JUnitFormatter junit_classname_template = {feature.filename} - 调整 CircleCI 配置中的测试执行命令
去掉原命令中的--junit参数,替换为新的格式化器,提前创建报告目录避免写入报错,修改后的测试步骤如下:- run: name: Test application command: | mkdir -p reports TEST=$(circleci tests glob "features/featurefiles/*.feature" | circleci tests split --split-by=timings --timings-type=classname) echo $TEST behave $TEST -f behave_junit_formatter -o reports/ - 确认测试结果上传路径正确
现有配置中store_test_results指向的reports路径和 Behave 配置的 JUnit 输出目录一致,无需调整。
注意事项
第一次执行工作流时,因为平台还没有对应测试的历史耗时数据,依然会走默认拆分逻辑。等第一次执行完成、测试报告成功上传解析后,第二次及后续触发的工作流就会自动按照每个 feature 文件的实际执行耗时做均匀拆分,实现按耗时并行的预期效果。
内容的提问来源于stack exchange,提问作者Naseem
相关产品推荐
相关产品推荐

