什么是代码增量分析?
对已有工程进行变更,其中新增、删除以及更新的部分,就是代码的增量。在测试驱动的开发中,基本上每一个新增的函数都会有响应的测试函数,但是对于“非线性”工作的人而言,测试驱动就像是要求一个调皮的学生在队列中安安静静的站着,基本上是不可能实现的。
代码增量分析是指通过对代码增量的分析,指出单元测试应当覆盖的新增部分,有效评估测试范围。
基于方法的代码增量分析
方法代码是程序的可执行逻辑,在代码增量分析中最有价值的就是方法的增量分析。新增、删除和更新分别代表不同的增量模型δ,假定有两个代码模型A和B,定义 B - A = δ为两个模型之间的增量,则δ必然与B或A同构,从而使得 A + δ = B。
通过取消 A + δ = B的性质,可以避免δ与A或B同构,从而可以产生δ的投影,在编程语言中,这种模型更加自然。可Java中,可定义非同构δ的模型为:
CompilationCodeBaseDiff {
Map<String,ClassCodeBaseDiff> classCodeBaseDiff;
}
ClassCodeBaseDiff {
type; // created, deleted,updated
role;// 类的角色:test, biz(默认), util, framework
Map<String,MethodCodeBaseDiff> methodCodeBaseDiff;// 方法内的不同,deleted时留空
}
MethodCodeBase {
methodName
methodSignature // (methodName,methodSignature) -> ID
type; // created,deleted, updated
body; // 方法体(可选)
originalBody;// 原有方法体(可选)
role; // 方法的角色: test, biz(默认), util, framework
}
量化代码增量分析
量化是一种典型的reduce思维。代码增量的量化方法并不唯一,取决于评价的目的。
量化指标:1.变动方法数量 2.编辑距离绝对值之和 3.单个方法行数
对增量分析结果进行可视化
自动化工具
1.自动生成测试用例
通过role来区分测试代码(role=test)和非测试代码(role!=test), 测试代码是对非测试代码的验证,测试代码无需验证自身。
测试类 -> 类名+Test
测试方法 -> test+方法名+ “_”+ 额外描述
增量分析模式:通过分析diff中的差异,标记出新增或更新的方法,然后查找这些方法在新的code base中的测试方法,如果一个都没有,则生成一个空的测试模板。
全量分析模式:遍历代码中的非测试方法,查找相应的测试方法,如果查找不到对应的方法,则生成空的测试模板。
2.触发关联的的测试用例自动执行
收集所有的测试用例,然后执行。
如果一个方法产生更新,则确定其所有关联测试方法,执行这些测试方法。