Ideas¶
调研¶
- 调研 j2k compiler 的效果
- 调研 Jacoco 对 Kotlin bytecode 的适用情况
- 调研 Soot/Flowdroid 对 Kotlin 的适用情况
算法¶
- 基于历史数据的测试用例重用技术:NMT + IR
- References:
- Automated assertion generation via information retrieval and its integration with deep learning
- On learning meaningful assert statements for unit test cases
- 思路:将高覆盖率的测试输入和待测函数的结构特征输入到 NMT 模型中训练。
- References:
思考¶
测试生成算法包含演化算法和基于历史数据的测试用例重用。演化算法中的每次演化针对的是单个待测函数,个体的适应度也指的是测试用例对待测函数的覆盖率。
- 演化算法
-
演化算法主要用于演化生成最好的方法调用序列。
- 基于历史数据的测试用例重用
-
重用方法调用的参数。测试用例重用分为两个层次:
-
第一类是测试输入级别的重用,例如针对待测函数 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接口,完成对对象行为的修改并使之生效。
Java的Instruments给运行时的动态追踪留下了希望,Attach API则给运行时动态追踪提供了“出入口”,ASM则大大方便了“人类”操作Java字节码的操作。
基于Instruments和Attach API前辈们创造出了诸如JProfiler、Jvisualvm、BTrace、Arthas这样的工具。以ASM为基础发展出了cglib、动态代理,继而是应用广泛的Spring AOP。
