如何无需fork即可修改RSpec JUnit formatter的测试文件路径输出
RSpec JUnit Formatter 输出文件路径与行号的免Fork实现方案
有两种无需修改上游源码的实现方式,可按需选择:
- 方案一:扩展原生JUnit Formatter
直接在项目内继承官方提供的JUnit Formatter类,重写类名生成逻辑即可,不需要改动gem源码。操作步骤如下:- 在
spec/spec_helper.rb中添加自定义Formatter代码:
class CustomJUnitFormatter < RSpec::Core::Formatters::JUnitFormatter private # 重写classname生成规则,直接返回文件路径+行号 def example_classname(example) # 可按需求调整路径裁剪规则,这里默认去掉spec目录前缀 rel_path = example.metadata[:file_path].delete_prefix('./spec/') line_num = example.metadata[:line_number] "#{rel_path}:#{line_num}" end end # 注册自定义格式化器 RSpec::Core::Formatters.register CustomJUnitFormatter, :dump_summary- 执行测试时指定使用自定义Formatter即可生成符合要求的报告:
rspec --format CustomJUnitFormatter --output rspec_report.xml
- 在
- 方案二:后处理生成的XML报告
如果不想调整测试执行的配置,可直接对生成的原生XML报告做批量替换:- 先按原有逻辑生成JUnit XML报告
- 用脚本批量转换classname字段的点分隔为斜杠,同时补全行号,简单的sed替换示例如下:
sed 's/classname="\([^"]*\)"/classname="'"$(echo \1 | tr '.' '/')"'"/g' original_report.xml > converted_report.xml
如果需要精准匹配行号,写几行Ruby脚本遍历XML节点、读取对应用例的元数据补全即可,实现逻辑非常简单。
两种方案均不需要Fork或修改上游RSpec JUnit Formatter的源码,适配性强,不会影响原有依赖的版本迭代。
内容的提问来源于stack exchange,提问作者nroose
相关产品推荐
相关产品推荐

