十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JaCoCo手动测试覆盖率全流程:从Tomcat接入到报告解读

JaCoCo手动测试覆盖率全流程:从Tomcat接入到报告解读 带团队这三年我见过太多项目把自动化测试覆盖率当硬性指标红线下百分之八十直接卡发布。但真正上线出事故的时候回头翻那些执行记录最薄弱的一环往往不是自动化没测到而是手动测试那几轮回归里压根没人点过那条代码路径。自动化覆盖率高不代表系统真的被充分验证过这件事做测试久了心里都有数。所以这两年我开始在项目里引入JaCoCo专门给手动测试过程做覆盖率统计。效果比想象中直接功能回归跑完哪个模块被点透了、哪段代码从头到尾没被碰过报告一拉出来清清楚楚不用再去问开发这块改了影响哪里然后靠拍脑袋定测试范围。这篇文章就把我在实际项目里把JaCoCo接到手动测试流程中的完整做法整理出来。包括JaCoCo两种工作模式的选型、远程Tomcat部署环境最常用的agent接入方式、报告里每个数字对应的真实含义以及把覆盖率数据真正用起来的一些进阶玩法和踩过的坑。适合Java技术栈、应用部署在Tomcat或其他Servlet容器、想把手动测试从纯黑盒变成可量化数据的团队参考。1. 手动测试的覆盖率盲区为什么自动化覆盖率替代不了黑盒验证1.1 自动化覆盖率高为什么线上还是出问题很多团队对覆盖率的理解停留在自动化测试跑了多少代码这个层面。单元测试覆盖率、接口测试覆盖率看起来数字很漂亮但它只能证明代码里能被自动化的部分被测过。问题恰恰出在自动化测不到的地方。举一个我实际遇到的例子。某个订单系统的退款流程单元测试覆盖了退款金额计算、幂等校验、状态流转这些核心逻辑覆盖率跑到百分之八十几。但手动回归的时候测试同学按正常路径走退款发现有一个分支退款申请后如果用户在十分钟内取消了退款系统需要回滚优惠券。这个入口页面在测试环境压根没有对应的自动化用例手动测试的同学也没想到要在这个时间窗口里去点取消退款。结果上线后真实用户触发了这个场景优惠券直接多发出去一批。自动化覆盖率衡量的是代码有没有被执行但它替代不了业务场景有没有被正确验证。特别是涉及跨系统交互、前端页面操作路径、时间窗口、并发状态这些复杂场景最终还是要靠手动测试去模拟真实用户行为。问题在于手动测试跑完之后我们只知道功能通过了代码覆盖了多少没人知道。1.2 黑盒测试的最大问题跑了功能但看不到代码足迹手动测试天然是黑盒的测试同学通过页面操作、接口调用、客户端交互来验证功能但操作背后到底触发了哪些类、哪些方法、哪些分支完全不可见。这就是覆盖率盲区。我见过最普遍的情况是测试环境发布了一个新版本回归测试用例写了几百条执行完汇总结果全是Pass。但开发一看JaCoCo报告发现某个改动涉及的核心Service类被测试点到的方法只有一半。剩下的一半是异常分支、降级逻辑、缓存穿透场景回归用例根本没设计到。开发得靠代码走查去提醒测试补用例测试又得手动去构造异常场景。这中间的沟通成本和时间损耗非常不值。所以我说手动测试需要自己的覆盖率数据。不是要替代自动化覆盖率而是把黑盒测试打开一个口子让测试人员能看到自己每轮操作在代码层面留下了什么足迹。JaCoCo就是干这个的。1.3 JaCoCo为什么适合干这件事JaCoCoJava Code Coverage是目前Java生态里使用最广的开源代码覆盖率工具。它基于字节码插桩实现核心优势在于不需要修改被测应用的源码通过Java agent或者离线字节码注入的方式在代码运行时记录每一条指令、每一个分支的执行情况最终生成覆盖率报告。跟其他同类工具比JaCoCo有几个点特别适合手动测试场景接入成本低不需要改一行业务代码在应用启动参数上加一个-javaagent就行。这对手动测试环境来说意味着无侵入。实时收集支持tcpserver模式应用运行期间就能通过命令行工具把覆盖率数据dump出来。手动测试不用等JVM退出就能拿到中间结果非常灵活。报告直观生成HTML报告之后哪些行是绿色、哪些是红色一眼能看测试同学不需要懂太深的细节也能看懂。活跃度和兼容性项目一直在更新0.8.x版本对JDK 11、17都支持。配套的命令行工具也能在无Maven/Gradle的环境下独立工作。手动测试场景特别适合用JaCoCo因为它不是一个测试框架它只是默默记录代码执行轨迹。你正常做你的功能测试它在背后帮你把足迹画出来。2. JaCoCo的工作机制on-the-fly与offline两种模式手动测试场景怎么选2.1 on-the-fly模式利用Java agent在类加载时注入JaCoCo最常用也最推荐的方式就是on-the-fly模式翻译过来就是运行期即时插桩。应用JVM启动时通过-javaagent:/path/to/jacocoagent.jar参数加载JaCoCo的agentagent会在每个类第一次被加载进JVM的时候用ASM字节码框架动态改写该类的字节码插入覆盖率记录探针。探针就是一段很小的代码放在方法入口、分支节点这些位置上。当程序执行到某个方法或某个分支时探针就会把我执行到了这个地方记录下来数据保存在JVM内存中。之后通过jacococli命令就能把这份数据导出成.exec文件再配合class文件和源码生成报告。这种模式最大的优点是对应用完全没有侵入。你不需要在构建阶段做任何额外处理也不需要改动Web应用的目录结构。Tomcat、Spring Boot内嵌容器、普通的Java进程都能用。手动测试的时候只要在启动命令上加一个参数之后所有测试操作就都被自动记录了。2.2 offline模式什么时候不得不用它跟on-the-fly相对的是offline模式也叫离线插桩。这个模式下JaCoCo会在应用启动之前直接把字节码插桩到class文件里然后再把插桩后的class文件打包部署。offline模式适用的场景比较特殊比如目标环境不支持Java agent或者被测应用使用的Java agent启动器和JaCoCo有冲突某些自定义类加载器、OSGi框架等又或者Android这类非标准JVM环境。offline模式下插桩发生在构建期所以需要构建脚本配合在产品class上先进行一遍instrument运行期收集数据最后再通过report命令生成报告。但说实话对于手动测试这个使用场景offline模式几乎没有必要。Tomcat和Spring Boot这些最主流的Web容器都支持Java agent方式而且offline模式有个很麻烦的副作用如果构建后忘记对某些class做插桩那么没有被插桩的代码在统计中会直接消失报告看起来像是覆盖率百分之百一样准确实际上丢失了大量数据。on-the-fly模式则不存在这个问题它拦截的是运行时加载的类只要加载到JVM里的类都会被处理。2.3 模式对比与选型建议对比维度on-the-fly模式offline模式接入方式JVM启动参数加agent构建期字节码插桩代码侵入完全无侵入需要改构建脚本动态代理类能处理可能漏掉适用场景绝大多数Web应用特殊容器/框架限制配置复杂度简单较高给一个直接的建议如果你只是想让手动测试有覆盖率报告环境是Tomcat、Spring Boot这类主流Java Web应用闭眼选on-the-fly模式。配置一条启动参数就够了报告生成也是两个命令的事。offline模式留给那些确实挂不上agent的特殊环境去研究。3. 远程Tomcat部署应用的接入全流程agent参数逐项拆解手动测试覆盖率的接入最典型的环境就是应用部署在远程测试服务器上通过浏览器或客户端去操作。这一步也是网上问得最多的远程Tomcat部署的应用怎么用JaCoCo统计代码覆盖率。下面把整个流程完整过一遍。3.1 准备JaCoCo的agent包和命令行工具先去JaCoCo官网下载对应版本的发布包注意区分两个东西lib/jacocoagent.jarJava agent需要放到被测应用所在的服务器上。lib/jacococli.jar命令行工具用于dump覆盖率数据和生成报告。这个可以放在你本机也可以放在服务器上看习惯。下载之前先确认一下JDK版本。JaCoCo 0.8.8以上对JDK 11和JDK 17支持得比较稳如果你的测试环境还是JDK 8用0.8.7或者0.8.8都行但尽量别追太老的版本否则碰到新语法编译出来的class文件会报Unsupported class file version。agent包放到服务器上之后路径最好固定在一个专门目录比如/opt/jacoco/后续改配置和更新版本都方便。3.2 修改Tomcat启动参数setenv.sh的推荐写法Tomcat本身支持通过环境变量来附加JVM参数最规范的做法是在bin/目录下新建一个setenv.sh文件Windows对应setenv.batTomcat启动的时候会自动加载它。不用去改catalina.sh这样升级Tomcat版本时配置不会丢。典型的setenv.sh配置如下export JAVA_OPTS$JAVA_OPTS -javaagent:/opt/jacoco/jacocoagent.jardestfile/data/jacoco/jacoco.exec,appendtrue,includescom.yourcompany.*,outputtcpserver,port6300,address*,sessionidmanual_test下面把每个参数拆开讲清楚这也是接入阶段最容易出错的部分。destfile覆盖率数据最终要落盘的路径。注意这个文件在JVM运行期间是agent自己维护的如果意外杀掉JVM数据可能没有刷到磁盘上。所以后面会用tcpserver模式配合dump命令从内存里拉取这个文件只是兜底方案。appendtrue这个参数控制JVM重启后要不要追加数据。我建议手动测试环境必须设成true因为测试环境经常要改配置重启如果设成false每次重启之前的数据都没了覆盖率统计就变成只统计本次启动后的数据没法汇总成整个测试周期的完整视图。代价是如果某次测试环境发布了大版本、应用结构变化很大建议手动删掉旧的exec文件再重启避免新旧代码数据混在一起。includes和excludes这两个参数非常关键。includescom.yourcompany.*表示只统计你公司业务代码把Spring框架、第三方jar包、动态代理生成的类全部排除在外。不设置includes的话报告里会出现海量的框架内部类和方法数据量大得根本没法看。实际配置时把你主要业务代码的包前缀都列出来用*通配符匹配。outputtcpserver让agent开启一个TCP服务端这样我们可以在应用运行的过程中实时把覆盖率数据dump出来。这是远程部署场景的推荐姿势因为它不依赖JVM退出。port6300tcpserver模式监听的端口随便选一个不冲突的就行但要把测试服务器的防火墙策略考虑进去确保能连到这个端口。address*监听所有网卡接口。如果只用127.0.0.1那远程就dump不了。注意这个参数开放之后任何人只要能连到这个端口都能拿你的覆盖率数据在测试环境问题不大但生产环境千万别这么开。sessionid给这次覆盖率采集起个名字比如manual_test。报告里会根据sessionid区分数据来源后面在多个测试阶段之间做区分就靠这个参数。配置好之后重启Tomcatcd /opt/tomcat/bin ./startup.sh启动之后立刻验证agent是否生效。先看进程参数ps aux | grep java输出里应该能看到-javaagent这一段同时Tomcat日志一般也会打一行类似JaCoCo agent started的信息。如果destfile目录设置了但文件还没生成也不用担心agent是等到有类加载时才开始记录destfile文件通常是JVM退出时才正式写入。3.3 执行手动测试并dump覆盖率数据应用正常起来之后测试同学就可以开始手动功能测试了。连续操作几十分钟期间产生的大量执行记录都存在JVM内存里存在agent维护的ExecutionDataStore里。测试进行到某个阶段比如冒烟测试刚结束或者回归跑完一轮用下面的命令把内存里的数据拉出来java -jar /opt/jacoco/jacococli.jar dump \ --address 192.168.1.10 \ --port 6300 \ --destfile /data/jacoco/manual_test_20240201.exec--address填测试服务器的IP--port必须是agent配置里的port6300。命令执行成功后.exec文件会写到指定路径。这个dump动作可以反复执行每次都会从agent内存里拉取数据——而且拉完之后不会清空JVM里的记录下次dump拿到的依然是启动以来所有执行数据的累计值。如果你希望分段统计需要在dump之后手动处理或者用sessionid区分这个后面再细说。有一点要注意dump命令本身要求本机的Java版本能兼容jacococli.jar建议和服务器上的JDK版本保持一致或更高避免莫名其妙的Java版本异常。3.4 生成HTML覆盖率报告拿到exec文件之后下一步就是生成报告。需要准备三样东西.exec覆盖率数据文件class文件目录对应被测应用编译后的class输出目录。注意必须和运行时的一致混淆过或者重新打包过的class就会对不上行号。源码目录有源码才能把覆盖标注到具体的代码行上生成带红绿色块的HTML报告。命令如下java -jar /opt/jacoco/jacococli.jar report \ /data/jacoco/manual_test_20240201.exec \ --classfiles /opt/tomcat/webapps/your-app/WEB-INF/classes \ --sourcefiles /opt/src/your-app/src/main/java \ --html /data/jacoco/reports \ --xml /data/jacoco/reports/report.xml \ --csv /data/jacoco/reports/report.csv一条命令同时产出HTML、XML、CSV三种格式。HTML给人直接看XML和CSV留给你自己写脚本做二次统计。生成完之后把/data/jacoco/reports目录挂到Tomcat的webapps下或者用Nginx指向这个目录测试同学就能直接通过浏览器访问覆盖率页面了。注意默认情况下JaCoCo生成的HTML报告里的CSS和JS是内联的直接文件路径访问也没问题但放到web容器下体验更好。3.5 本地开发自测的轻量做法IDEA内置的JaCoCo除了远程环境开发自己在本地做开发自测时也可以用JaCoCo确认一下改动被自己的手动操作覆盖到了。这个场景比远程Tomcat更简单IDEA已经内置了JaCoCo支持。在IDEA里直接右键运行方法或启动Spring Boot应用选择Run with Coverage跑完之后IDE会自动弹出一个覆盖率面板显示每个类的行覆盖、分支覆盖情况点击还能定位到具体行。这个功能对于开发自测特别有用改完一个功能把应用跑起来浏览器里自己点两下回来一看Coverage面板就知道刚才那两下点到了哪些代码哪些分支根本没进去。比硬着头皮对着控制台日志猜靠谱多了。注意IDEA内置的JaCoCo默认只覆盖当前启动的进程适合本地快速验证不适合远程测试环境的持续统计。远程环境还是要老老实实用agent方案。4. 报告里每个数字代表什么从结构覆盖率到功能覆盖率4.1 五个核心指标的含义和优先级JaCoCo报告的汇总页上有五个指标指令覆盖、行覆盖、分支覆盖、方法覆盖、类覆盖。很多测试同学拿到报告之后对着这几个百分比一头雾水我把它们挨个解释清楚。指令覆盖Instruction Coverage这是最底层的指标。JaCoCo的插桩是基于字节码指令的它统计的是JVM字节码指令中有多少比例被执行过。简单理解就是JVM最基础的执行单元被跑过的比例。这个指标参考价值有限因为它粒度太细普通测试人员感知不到执行了指令和功能验证之间的关系。行覆盖Line Coverage统计的是源码层面多少行代码被执行过。这个指标最直观也是默认报告里最显眼的数字。手动测试看行覆盖率大概是这样的一个类有100行代码功能测试跑下来有85行被点到剩下的15行就是你没测到的代码路径很可能就是异常分支或者边界条件。分支覆盖Branch Coverage统计if、switch、三元表达式等分支点的真和假两个方向分别有没有被覆盖。一个if有true和false两条路径如果只测了true没测false分支覆盖就是50%。这个指标对手动测试的意义在于行覆盖高不代表分支覆盖高可能你所有的测试路径都走了正常分支异常分支一行都没碰到但行覆盖看着还挺漂亮。方法覆盖Method Coverage统计了多少方法被执行过。这个指标粒度太粗一般一个类可能有几十个方法某个方法只要执行了就算覆盖哪怕只执行了方法里的第一行。所以方法覆盖率数字往往虚高参考价值不大。类覆盖Class Coverage统计了多少类被加载执行过。这个指标主要用来快速定位这个模块的代码完全没被测到因为只要某个类一次都没被加载它就会在报告里标红。实际看报告的时候建议把行覆盖和分支覆盖放在一起看。手动测试的核心价值是验证业务行为而业务行为的分支就是流程的岔路口。如果某个核心类的分支覆盖只有百分之三四十哪怕行覆盖到了百分之八十也要警惕是不是只测了Happy Path异常和边界全漏了。4.2 结构覆盖率和功能覆盖率的关系关于功能覆盖率怎么查看这个问题需要先把概念分清。JaCoCo这样的工具统计出来的是结构覆盖率也就是代码结构行、分支、方法、指令被执行的比例。它衡量的是代码层面跑到了多少。而功能覆盖率是需求层面的概念衡量的是业务功能点中有多少被验证过。比如一个登录模块功能点包括账号密码正确登录、密码错误提示、账号锁定、验证码失效、第三方登录这五个你只测了前三个功能覆盖率就是百分之六十。JaCoCo是查不了功能覆盖率的因为它不懂业务需求。功能覆盖率的统计需要在测试设计阶段就做需求拆解把每个功能点落到具体的测试用例上然后在测试管理平台禅道、TestRail、Jira等里手动打勾或者维护一张需求-用例-执行结果的矩阵表。但这不代表结构覆盖率没意义。合理的用法是用结构覆盖率反向检查功能覆盖率的盲区。如果某一个类的行覆盖是零说明对应的功能点要么没设计用例要么用例根本没执行到。如果分支覆盖很低说明功能里的某个判断条件缺乏测试。把JaCoCo的报告作为探针去反推功能测试用例的设计质量效果远比你光看功能覆盖率清单要好。4.3 怎么快速定位未覆盖的代码HTML报告打开之后进入具体的包路径能看到每个类的覆盖情况。点击类名进去页面左边是源码每行代码有颜色标记绿色该行被执行过红色该行没有被执行过黄色该行是分支语句有一部分分支没走到右边的数字表示该行被执行的次数0就是没执行。定位未覆盖代码的时候直接找红色和黄色的行重点看两个位置异常处理块和边界分支。异常处理是手动测试最容易漏的比如文件上传时的空文件、接口超时、数据库连接失败这些故障注入场景测试用例里常常没有。我在实际项目中每次手动回归完拉报告扫一眼红色区域几乎总能发现一两处自己之前没考虑到的异常路径。有一点经验提醒大家覆盖率报告要在测试执行过程中就拉不要等全部测完再拉。因为等测完再拉如果覆盖有盲区你还要重新构造数据、重新登录系统去测那些漏掉的路径来回成本特别高。每测完一个模块就dump一次报告当场就能知道这个模块还有没有漏掉的分支测试效率会高很多。5. 把手动覆盖率真正用起来session管理、增量分析与避坑经验5.1 用sessionid区分多个测试阶段手动测试往往不是一个连续过程。一个版本上线前会分冒烟测试、功能测试、回归测试好几个阶段不同阶段由不同的人执行。如果从头到尾用同一个destfile累积数据最后报告里只会显示所有阶段汇总之后的总覆盖率哪个阶段覆盖了什么、哪个阶段没覆盖什么完全看不出来。解决办法是用sessionid。在每个阶段开始之前通过tcpserver模式连上agent重新设置sessionid或者在每次dump之后记录对应的阶段名。还有一种做法更简单每次dump的文件单独命名比如smoke_20240201.exec、regression_20240202.exec然后让JaCoCo的report命令同时读取多个exec文件合并报告。合并命令java -jar /opt/jacoco/jacococli.jar report \ smoke_20240201.exec \ regression_20240202.exec \ --classfiles /opt/tomcat/webapps/your-app/WEB-INF/classes \ --sourcefiles /opt/src/your-app/src/main/java \ --html /data/jacoco/reports_merged这样就能实现各阶段独立报表 整体汇总报表。说实话我第一次用这种方式给团队里一个项目做手动测试覆盖率周报的时候效果非常惊艳测试负责人一眼就看到了啊回归测试这轮居然没覆盖到支付回调这个类这样的盲区。5.2 增量覆盖率只关心这次改动有没有被测试点到全量覆盖率对存量代码的统计很有意义但真正上线前最关心的问题是这个版本改了哪些代码我的手动测试有没有把这些改动覆盖到。这就是增量覆盖率的价值。JaCoCo官方并没有直接提供增量覆盖率这个功能它只能告诉你总计覆盖了多少。要算增量覆盖率常见做法是结合Git diff来做。基本思路是用git diff拿到本次版本相对于上一个标签的改动文件清单和行号范围。从JaCoCo生成的XML报告中解析每个类、每个行的覆盖情况。把Git diff里的变更行和覆盖率报告里的行状态做交叉比对统计出改动行中有多少行被执行过。具体实现不复杂我简单给一个Python脚本的伪代码思路# 解析report.xml拿到每个类的行覆盖信息 class LineCoverage: def __init__(self, class_name, line_number, covered): ... # 解析git diff拿到每个类的变更行号 class DiffLine: def __init__(self, class_name, line_number): ... covered_changed_lines 0 total_changed_lines 0 for diff_line in diff_lines: coverage_info coverage_map.get((diff_line.class_name, diff_line.line_number)) if coverage_info and coverage_info.covered: covered_changed_lines 1 total_changed_lines 1 incremental_coverage_rate covered_changed_lines / total_changed_lines如果你不想自己写脚本也可以直接用现成的开源工具比如在Maven项目里用jacoco-maven-plugin配合一些社区插件实现增量报告。不过对于手动测试场景应用不一定由Maven管理我建议还是老老实实写个小脚本一劳永逸。跑完手动回归把报告拉下来喂给脚本十分钟就能算出本次改动覆盖了多少这个关键数字。这个数字在发布评审会上说出去比一句干巴巴的都测过了有说服力得多。5.3 接入过程中的常见坑和排查方法JaCoCo的接入不算复杂但实际项目里还是有不少坑。我把遇到过的问题整理出来。坑一多个JVM实例覆盖数据互相覆盖。如果测试服务器上同时部署了多个Tomcat实例每个实例的destfile如果指向同一个文件后启动的JVM会把前面的数据覆盖掉。排查方法很简单配置agent时给每个实例指定独立的destfile和独立的port比如port 6300、6301、6302分开。坑二agent配置了但没生效。最常见的原因是-javaagent:参数写错路径或者agent参数里包含空格导致启动脚本解析异常。用ps aux | grep java看进程参数最直接看到javaagent就说明agent挂上了。还有一点容易被忽略有些Tomcat是通过CATALINA_OPTS传递JVM参数的注意JAVA_OPTS和CATALINA_OPTS的区别。Tomcat启动脚本里JAVA_OPTS会在所有Java命令中都会用到而CATALINA_OPTS只作用于Tomcat主进程如果你的应用有自己的服务进程可能只读到JAVA_OPTS。所以要加到JAVA_OPTS里面。坑三涉及动态代理和反射的代码统计不到。Spring自带的CGLIB代理类、MyBatis动态生成的Mapper实现类这类运行时生成的字节码JaCoCo不一定能准确识别对应到源码的行号报告的准确性会下降。好在这类问题的实际影响通常是多出一些黄色的行不至于影响整体判断。如果你发现某个类的覆盖率数据明显奇怪优先确认一下是不是代理类。坑四性能影响和压测环境。JaCoCo插桩必然带来性能开销实测下来在百分之五到百分之十之间的样子。功能测试、页面点击、接口调用这种不影响使用但如果手动测试里有大数据量导入导出、长时间压测这类高负载场景JaCoCo的插桩成本会放大。我的建议是压测环境就别挂agent太影响性能测试的准确性功能测试和回归测试环境挂上没问题。坑五JDK版本兼容问题。JaCoCo对JDK版本有明确的支持表比如0.8.8开始支持JDK 170.8.10开始支持JDK 21。如果某个类是用很新的Java语法编译的而agent版本太老会直接报Unsupported class file major version错误然后整个JVM启动失败。接入之前先确认好双方的版本匹配关系。这个坑我在一个升级了JDK 17但JaCoCo还停在0.8.5的项目里踩过线上直接启动不了血淋淋的教训。5.4 手动测试与覆盖率数据的闭环实践覆盖率报告生成出来如果只是打开发布会上念一下数字意义有限。真正有价值的做法是把手动测试用例和覆盖率报告建立映射。我的做法是在现有测试用例管理平台里给每个测试用例关联这个用例主要验证哪些核心类。手动测试执行完一个用例之后dump一次jacoco数据生成该用例的独立覆盖率报告。这样每一条测试用例都有了对应的代码足迹用例设计得好不好、有没有真的覆盖到目标代码一目了然。日积月累之后还能通过分析高优类的手动覆盖率发现哪些用例需要补充、哪些用例重复冗余可以合并。这个实践最朴素的落地方案是这样把测试用例按模块拆分每个模块对应一个或多个核心类清单。手动测试按模块执行每执行完一个模块dump一次exec文件并生成该模块的报告。把报告和模块测试结果放到团队的共享文档或wiki里。测试周会上花十分钟过一遍覆盖率报告重点看未覆盖代码讨论为什么没覆盖、是场景缺乏还是用例遗漏。这套流程不需要什么工具开发成本用JaCoCo的命令行加一个共享目录就能跑起来。但它带来的变化是实实在在的测试团队开始用数据说话而不是凭直觉判断测没测全。有一点要提醒的是手动测试覆盖率不要设一个刚性的KPI门槛。比如手动测试覆盖率必须达到百分之七十这种目标会逼着测试团队为了凑覆盖率去做无效操作比如反复点同一个按钮、跑大量无意义的边界数据覆盖率数字上去了但测试质量并没有提升。手动测试覆盖率更适合用来做盲区发现而不是达标考核。它的价值是告诉你哪些地方没测到然后由你根据业务风险去判断这个没测到的地方要不要补。带着这个思路用JaCoCo它才会真正成为测试流程里的一件趁手工具而不是另一个数字指标。
返回列表