如何计算基于jersey-test的REST API接口测试覆盖率
JaCoCo 适用性说明
JaCoCo 本质是代码级覆盖率统计工具,统计维度是代码行、分支、方法的执行情况,和你需要的「测试请求命中API路径才算覆盖」的需求不匹配。比如某接口方法被测试代码直接调用而非通过HTTP请求触发,JaCoCo也会判定为覆盖,但不符合你对API覆盖的定义,因此JaCoCo不能直接满足当前场景需求,仅可作为补充校验手段。
推荐实现方案
方案1:Jersey Filter 埋点统计(最稳定)
不需要解析日志,不会受日志格式变动影响,准确率最高。你可以自定义一个测试专用的
ContainerRequestFilter,所有测试请求执行时都会被该过滤器拦截,直接提取匹配后的路由模板和请求方法存入全局集合去重,测试全量执行完成后,扫描所有Jersey资源类的@Path、@GET/@POST等注解拿到全量API列表,对比后即可计算覆盖率。
核心代码示例:@Provider public class ApiCoverageFilter implements ContainerRequestFilter { // 存储所有被命中的API,格式为「请求方法 路由模板」 public static final Set<String> COVERED_API_SET = ConcurrentHashMap.newKeySet(); @Override public void filter(ContainerRequestContext requestContext) { ExtendedUriInfo uriInfo = (ExtendedUriInfo) requestContext.getUriInfo(); // 拼接匹配到的完整路由模板,而非实际请求的带参路径 String routeTemplate = uriInfo.getMatchedTemplates().stream() .map(UriTemplate::getTemplate) .collect(Collectors.joining("")); String apiUniqueKey = requestContext.getMethod() + " " + routeTemplate; COVERED_API_SET.add(apiUniqueKey); } }只需在jersey-test的测试配置中注册该过滤器,测试全部跑完后读取
COVERED_API_SET和全量API列表做差集计算即可。方案2:基于OpenAPI规范的统计方案
如果你已经维护了项目的OpenAPI/Swagger接口文档,可以直接解析OpenAPI规范文件拿到全量API列表,再配合上述过滤器的命中结果做统计,不需要自己扫描Jersey资源类,后续接口变更只需要更新OpenAPI文件即可,不需要修改统计逻辑。
方案3:日志解析方案(最低侵入)
如果你不想修改任何测试代码,可以选择你原本考虑的日志解析方案:开启Jersey访问日志,配置日志输出规则包含请求方法、匹配后的路由模板,测试跑完后写脚本提取日志中的API标识去重,再和全量接口列表对比计算覆盖率。该方案的缺点是日志格式调整后需要同步修改解析逻辑,存在漏统计、重复统计的风险,稳定性低于埋点方案。
注意事项
- 统计时必须将请求方法和路由模板绑定作为API的唯一标识,避免同路径不同请求方法的接口统计错误,比如
GET /user和POST /user属于两个不同的接口。 - 不要使用实际请求的带参路径做统计,必须使用匹配后的路由模板,否则
/user/1、/user/2这类带路径参数的请求会被识别为不同的接口,无法正常去重。
内容的提问来源于stack exchange,提问作者user1455836

