如何获取指定测试方法覆盖的代码行并导出至文本文件?
问题:获取单个测试用例覆盖的代码行并导出为文本文件
我需要获取某个测试用例覆盖的所有代码行,格式示例如下:
org.apache.commons.lang.text.StrBuilderAppendInsertTest.testAppendFixedWidthPadLeft(org.apache.commons.lang.text.StrBuilderAppendInsertTest) org.apache.commons.lang.text.StrBuilder:appendFixedWidthPadLeft:1188 org.apache.commons.lang.text.StrBuilder:appendFixedWidthPadLeft:1191 org.apache.commons.lang.text.StrBuilder:appendFixedWidthPadLeft:1194 org.apache.commons.lang.text.StrBuilder:appendFixedWidthPadLeft:1185 org.apache.commons.lang.text.StrBuilder:clear:288 org.apache.commons.lang.text.StrBuilder:clear:287 org.apache.commons.lang.text.StrBuilder:<init>:111 org.apache.commons.lang.text.StrBuilder:<init>:112 org.apache.commons.lang.text.StrBuilder:setNullText:171 org.apache.commons.lang.text.StrBuilder:setNullText:172 org.apache.commons.lang.text.StrBuilderAppendInsertTest:<init>:56 org.apache.commons.lang.text.StrBuilderAppendInsertTest:<init>:55
就像示例里这样,testAppendFixedWidthPadLeft测试方法覆盖了StrBuilder类中appendFixedWidthPadLeft等方法的指定行。我试过Cobertura、Jacoco、Gzoltar这几个工具,但都没得到预期的输出格式,求可行的解决方案。
可行解决方案
用Jacoco精准提取
Jacoco完全能做到,只是你可能没用到正确的姿势:
- 先让测试生成Jacoco的
.exec覆盖文件,在构建脚本(比如Maven/Gradle)里配置Jacoco插件,开启dumpOnExit,指定好输出的.exec路径。 - 用Jacoco的CLI工具生成XML报告,命令大概是:
java -jar jacococli.jar report path/to/your.exec --classfiles path/to/classes --sourcefiles path/to/src --xml path/to/report.xml - 写个简单的脚本(Python、Groovy都行)解析这个XML,找到对应测试用例的节点,把里面的类名、方法名、行号提取出来,直接格式化成你要的文本格式就行。XML里每个测试的覆盖行都有明确的映射,很好提取。
- 嫌写脚本麻烦的话,也可以用Jacoco的Java API直接读
.exec文件,定位到单个测试会话的覆盖数据,精准输出行信息。
自己写JUnit扩展定制输出
如果工具自带的输出不符合预期,自己写个轻量扩展也不难:
- 写个JUnit的
TestWatcher,在测试方法执行前后,结合Jacoco的离线插桩(提前给类插好覆盖计数的代码),在测试结束后遍历目标类的方法,读取被覆盖的行号。 - 把读取到的类名、方法名、行号按照你要的格式直接写入文本文件,完全自定义格式,想怎么输出就怎么输出。
调整Gzoltar的配置
你之前用Gzoltar没得到结果,大概率是配置不对:
- 用Gzoltar的
runTest命令执行单个测试,加上--outputCoverageFile参数生成覆盖数据,然后用export命令指定--format plain,生成的文件里会有测试用例和覆盖行的映射,稍微调整下格式就能匹配你的需求。比如Gzoltar生成的plain格式会有类似testcaseId,class:method:line的条目,你只需要把格式转成示例里的样子就行。
内容的提问来源于stack exchange,提问作者Nakhla Rafi
相关产品推荐
相关产品推荐

