如何让Boost Unit Test在JUnit testcase属性中显示文件名?
关于Boost Unit Test JUnit日志文件名位置的问题解答
问题1:Boost Unit Test能否直接将文件名添加到属性中?
不能。Boost Unit Test自带的JUnit日志器(log_format=JUNIT)没有提供配置选项,能把测试用例的文件名从<system-out>标签内转移到<testcase>的属性里。默认的JUnit输出格式中,<testcase>的属性是预定义的(比如assertions、classname、name、time这些),Boost的实现既没开放自定义这些属性的接口,也不会自动从日志内容里提取文件名放到属性中。
问题2:通过Shell脚本调整的方案
可以用Shell脚本结合XML处理工具(推荐xmlstarlet,比sed/awk处理XML更可靠)来修改生成的JUnit XML文件,具体步骤如下:
前提准备
先安装xmlstarlet,大部分Linux发行版可以通过包管理器安装:
# Debian/Ubuntu系 sudo apt install xmlstarlet # RHEL/CentOS系 sudo yum install xmlstarlet
操作步骤
- 先运行测试生成原始JUnit XML文件:
./test --log_level=all --log_format=JUNIT --report_level=no > test_results.xml
- 编写Shell脚本(比如
fix_junit_file_attr.sh)来修改XML:
#!/bin/bash INPUT_XML="test_results.xml" OUTPUT_XML="fixed_test_results.xml" # 提取每个testcase对应的文件名 for testcase in $(xmlstarlet sel -t -v "//testcase/@name" "$INPUT_XML"); do # 从当前testcase的system-out中提取文件名 filename=$(xmlstarlet sel -t -v "//testcase[@name='$testcase']/system-out" "$INPUT_XML" | grep -oP 'file\s*:\s*\K[^\\n]+') # 给该testcase添加file属性 xmlstarlet ed -P -S -L -i "//testcase[@name='$testcase']" -t attr -n "file" -v "$filename" "$INPUT_XML" # 可选:删除system-out中的文件名和行号信息 xmlstarlet ed -P -S -L -u "//testcase[@name='$testcase']/system-out" -v "$(xmlstarlet sel -t -v "//testcase[@name='$testcase']/system-out" "$INPUT_XML" | sed '/file\s*:/d;/line\s*:/d')" "$INPUT_XML" done # 重命名处理后的文件 mv "$INPUT_XML" "$OUTPUT_XML"
- 给脚本添加执行权限并运行:
chmod +x fix_junit_file_attr.sh ./fix_junit_file_attr.sh
简化版(单测试用例场景)
如果你的测试结果只有一个testcase,也可以用更轻量的sed命令处理:
#!/bin/bash raw_content=$(cat test_results.xml) # 提取文件名 target_file=$(echo "$raw_content" | grep -oP 'file\s*:\s*\K[^\\n]+') # 插入file属性并清理system-out的冗余内容 echo "$raw_content" | sed "s/<testcase/<testcase file=\"$target_file\"/" | sed '/file :.*//; /line :.*//' > fixed_test_results.xml
内容的提问来源于stack exchange,提问作者PillFall
相关产品推荐
相关产品推荐

