Skip to content

Ideas

调研

  1. 调研 j2k compiler 的效果
  2. 调研 Jacoco 对 Kotlin bytecode 的适用情况
  3. 调研 Soot/Flowdroid 对 Kotlin 的适用情况

算法

  1. 基于历史数据的测试用例重用技术:NMT + IR
    1. References:
      1. Automated assertion generation via information retrieval and its integration with deep learning
      2. On learning meaningful assert statements for unit test cases
    2. 思路:将高覆盖率的测试输入和待测函数的结构特征输入到 NMT 模型中训练。

思考

测试生成算法包含演化算法和基于历史数据的测试用例重用。演化算法中的每次演化针对的是单个待测函数,个体的适应度也指的是测试用例对待测函数的覆盖率。

演化算法

演化算法主要用于演化生成最好的方法调用序列。

基于历史数据的测试用例重用

重用方法调用的参数。测试用例重用分为两个层次:

第一类是测试输入级别的重用,例如针对待测函数 A 生成了高覆盖率的测试用例集 TA,当遇到和函数 A 有相同结构的待测函数 B 时,可以重用测试用例集 TA 的测试输入生成高覆盖率的测试用例集 TB。

第二类是方法调用序列级别的重用,例如针对待测函数 A 生成了高覆盖率的测试用例集 TA,当针对待测函数 B 生成测试用例集时,如果 函数 B 的执行情况受到了函数 A 的影响,即待测函数 B 的测试用例中的方法调用序列中包含了对函数 A 的方法调用,那么可以重用 TA,直接替换方法调用序列中对函数 A 的调用。

第一类测试用例重用举例:

fun foo(A: String, B: String): Boolean {
    if (A == "" || B == "") {
      return 0
   }
   return 1
}

// test cases: foo("", "") and foo("abc", "def")

针对 A == "" || B == "" 这一程序结构可以复用其测试用例集。

第二类测试用例重用举例:

class Example {
   var state = false

   fun foo() {
      state = true
   }

   // function bar is influenced by function foo
   fun bar() {
      if (state) {
         return true
      }
      return false
   }
}

函数 bar 受到函数 foo 的影响,因此函数 bar 的测试用例的方法调用序列中应当包含对函数 foo 的调用,因此可以重用函数 foo 的测试用例集。

工具

JaCoCo

Ref: Setup JaCoCo code coverage with your Multimodule Android App Kotlin

Other

Reference: Java动态追踪技术探究

ASM1

操作字节码文件

BTrace2

BTrace是基于Java语言的一个安全的、可提供动态追踪服务的工具。BTrace基于ASM、Java Attach Api、Instruments开发,为用户提供了很多注解。依靠这些注解,我们可以编写BTrace脚本(简单的Java代码)达到我们想要的效果,而不必深陷于ASM对字节码的操作中不可自拔。

BTrace主要有下面几个模块:

  • BTrace脚本:利用BTrace定义的注解,我们可以很方便地根据需要进行脚本的开发。
  • Compiler:将BTrace脚本编译成BTrace class文件。
  • Client:将class文件发送到Agent。
  • Agent:基于Java的Attach Api,Agent可以动态附着到一个运行的JVM上,然后开启一个BTrace Server,接收client发过来的BTrace脚本;解析脚本,然后根据脚本中的规则找到要修改的类;修改字节码后,调用Java Instrument的reTransform接口,完成对对象行为的修改并使之生效。

img-20221104195624

Java的Instruments给运行时的动态追踪留下了希望,Attach API则给运行时动态追踪提供了“出入口”,ASM则大大方便了“人类”操作Java字节码的操作。

基于Instruments和Attach API前辈们创造出了诸如JProfiler、Jvisualvm、BTrace、Arthas这样的工具。以ASM为基础发展出了cglib、动态代理,继而是应用广泛的Spring AOP。