0415-测试右移答疑帖

请大家将上周六课程的疑问回复到本帖。统一在此解答

老师好,测试左移讲到可以用 coverage.xml 制造覆盖率数据给 sonarqube 显示。

以下是我在工作中打算实践的思路:

  1. 统计当前新版本 diff 结果
  2. 获取到提交的类、方法、代码行
  3. 根据提取数据初始化生成 coverage.xml 文件且全部行均置为 false
  4. 运行单元测试用例,获取覆盖数据并回写给 xml 文件
  5. 提交到 sonar

问题一:
这个思路是否可行,有没有明显遗漏或缺失。

问题二:
coverage.xml 文件如何生成,要根据单元测试运行结果而定。但 sonar 本身也可以统计全量、增量覆盖率数据,完全可以基于 sonar 来运行单元 case,那么 xml 文件的实际应用场景是什么样的。

  • 基于业务的监控常用的手段有哪些?除了log其他的吗?
  • 基于app的业务监控,特别是支付这一块要注意哪些方面?

第三步是没有用,本来覆盖率也默认是0. 不过只是获取单元测试的覆盖率,你不如直接使用sonarqube提供的默认覆盖率收集的功能。

这个coverage.xml是两种,第一种是jacoco report生成的覆盖率文件。第二种是sonarqube自己定义的通用覆盖率格式文件。不知道你说的是哪一种。

通用覆盖率文件是有标准格式的,可以自己对照标准格式直接生成。比如使用文件模板或者xml相关的api。
https://docs.sonarqube.org/latest/analysis/generic-test/

对的,你直接使用sonarqube默认的覆盖率收集流程就可以了。

为什么我会提到自定义的代码覆盖率制作问题

原因如下
sonarqube会自动识别新增代码与覆盖率数据。比如代码变更里研发修改了某个变量或者对一行if语句做了一个格式化,最典型的是使用了idea提供的代码自动格式化功能。这个时候整个文件就全部变了。但是实际上逻辑没有任何变化。sonarqube的文件变更并不太精准,我们想可以根据asm/javap字节码分析、javaparser语法树(AST)分析,可以得到更精准的代码变更,避免被一些无意义的修改影响。这个时候就需要用到自定义diff覆盖率

那这样会有另外一个问题,如果我新增/修改的代码,是上下文有依赖的,这样还会漏测啊,那我需要分析依赖的代码来覆盖,语法树AST分析可以解析出来吗?

比如说修改了一个底层函数,极端情况我们修改下string.toString,这样所有的字符输出都会干扰。这个时候的确是需要分析出来真正变更的范围。

代码的执行本质是一种图结构,可以简化为树结构。假设一个mp3的搜索词。他会经过这样的代码调用链。

testcase=mp3 http->spring boot->controller -> method a -> if -> line 10 11 -> line 15 -> base64() -> 16
testcase=mp4 http->spring boot->controller -> method a -> if -> else -> line 12 13 -> line 15 -> base64 -> 16

如果base64这个函数被修改,那么两个case就算没任何代码变更,也发生了变化的。所以前文也提到了自定义diff覆盖率的重要性。

如何发现真正的变更

  • ast语法树分析。可以通过依赖计算推算发生变化的范围,不过计算结果会比较大。
  • 调用链分析,根据实际调用记录调用链关系,只要链上的代码发生变更,就认为这条链所对应的用例或者功能也发生了变更。

这块知识比较深,所以我们不做要求

调用链分析

  • 覆盖率只是二维数据,例如 locatorion: line or branch , 是否覆盖=true false
  • 调用链多了一个维度,就是 [ location1, location2 location3 ],这种链表结构。

思考一下,如何拿到这个多个时序维度?

  • 代码插桩 jvm-sandbox trace功能
  • 语法树,语法树天然就具备时序分析能力。调用指令的先后顺序是可以分析出来的。不过分析结果会超大。

通常是动态trace结合静态分析。利用neo4j图数据库进行计算,或者自己编写图或者树算法。

APM:应用性能监控,通常是通过代码插桩搞定
业务埋点监控:研发埋点关键业务的代码,后端通过ElasticStack或者Hadoop Spark分析
日志监控:web log监控体系
Crash监控:代表作Bugly

金融行业通常都有数据监控,然后就是资产风控、对账、资损等数据分析体系。

关闭