Chianti- Java下代码变更影响分析工具
www.fireknight.tech 个人博客,欢迎访问,CSDN不定期更新
-
总结
- 目标
- 代码更改和测试相关联
- 三个贡献
- 根据变更找测试,代码更改,观察特定测试的变化
- 回归测试选择,只选择可能被更改影响的测试
- 更快debug
- 目标
-
ABSTRACT
- chianti分析变动,变动显示于测试。对被变动影响了的测试,chianti可以找出对应的变动
- 对于Daikon, 每次改变有52%测试被影响,但每个测试只被3.95%原子改变影响
-
INTRO
-
OVERVIEW
- 各种原子修改的引入
- 调用图:节点为方法,边为方法调用
- 变更计算
- 分析对应的公式
-
Changes – Change Impact Analysis for Object-Oriented Programs内容,对应本文overview
-
本文将修改分为以下几个部分
-
将代码修改映射为原子变更
- 任何代码都可以对应到特定的原子变更
-
各个原子的详细介绍见论文
-
Changes affecting method dispatch – LC的详细介绍(lookup change)
-
lookup
- 三个参数:
- 运行时接收者
- 静态标记方法
- 实际调用方法
- <C, A.m, B.m> A.m是声明方法,C继承于A,B是C的最近的祖先并且包含了A.m,即C < B < A
- 三个参数:
-
LC
- <C, A.m>
- 计算
- 按照定义从头开始建模运行时类型和方法签名的层次结构,但有开销
- 每次编辑后更新lookup映射 √ 见后文
-
SameLookup(B, f())
- 在每次的调用后,最终都调用了B.f(), 有C<B<Y的继承关系
-
变更计算
-
举例关于LC的计算
- LC是标识当前代码调用的符号关系代号,新旧版本的相同LC实际含义发生变更,则有代码变更影响
- 举例
-
原来有Professor.toString(),会有lookup如下
-
增加Person.toString(),会有lookup如下
-
LC为
-
这两个代表的动态调用发生了变化
-
-
顺序
- 原子变更是相互独立的,但在组成新版本代码时有顺序关系
- 只考虑必须满足以确保可编译性的语法依赖关系。
- 变更之间没有语法依赖。单个的变更可以生成新的程序p’,并且p’也是可运行的。变更组合会形成P’(新代码)
-
-
代码变动影响分析 – Change Impact Analysis for Object-Oriented Programs内容,对应本文overview
- 程序P,测试T = t1, · · · , tn
- Nodes(P, ti) 测试ti经过的方法
- Edges(P, ti) 方法调用
- A.m →C B.n A.m到B.n通过对C的调用
- 计算
-
AffectedTests(T ,A) 受A影响的测试
- 对于每一个测试,测试经过的Nodes(P, ti)有过修改,并且调用发生了Lookup change, 则测试受到影响
- 如果测试的调用图(在程序的原始版本中)包含一个节点,该节点对应于已更改的方法(CM)或已删除的方法(DM)更改,或者测试的调用图包含一个边,该边对应于查找更改(LC),则测试被确定为受影响(本文定义)
- 注意:P3 it is easy to see that 实例讲解
- 有一次当前调用图,然后修改。精确测试回归选择:可以找到影响了的测试
-
AffectingChanges(t,A) 影响测试t的代码变更
- 对任何一个修改,如果修改在测试t的路径(新测试的节点)上,或者修改属于lookupchange(LC涉及到新测试t的调用),则修改影响了测试t
- 为了计算影响给定受影响测试的更改,我们需要在程序的编辑版本中为该测试构建一个调用图。①所有原子变化添加方法(AM)和更改方法(CM)对应于调用图中的一个节点(在编辑程序) ②LC在新版调用图的边中 (本文定义)
- 注意:P3 it is easy to see that 实例讲解
- 两个版本代码,两个调用图。可以找到测试对应的修改。
- 效果:
- 代码变动,affectedTest为空,说明测试不足。affectTest是找到影响的测试,如果没找到,就说明测试不足。
- 代码变动,affectTest不为空,说明有测试受到影响。则测试是否需要修改是程序员要考虑的问题。
- 代码修改后,测试可能产生错误。使用affectingChange寻找相关修改,用来debug。
-
ATOMIC CHANGES AND THEIR DEPENDENCES
-
Engineering Issues
- 对匿名类的处理
- Chianti对比代码,分析类时需要根据类名比对,但匿名类没有固定类名
- 新类名为:enclosingClassName, enclosingElementName, selfSuperclassInterfaceName, sequenceNumer
- 对匿名类的处理
-
原型
-
评估
- Daikon 2002年一年内代码以周为单位进行分析
- Atomic Changes
- Atomic Changes分析
- Affected Tests and Affecting Changes
- 图表分析
-
相关工作 – 重点
- Change Impact Analysis Techniques
- 代码变更影响分析技术
- Regression Test Selection
- 回归测试选择
- Controlling the Change Process
- 不知道说了个啥,一种代码变更控制技术?
- Change Impact Analysis Techniques
-
FUTURE WORK
- 静态调用图和动态调用图方法比对
- 更细粒度的更改单元
- 当前CM的多种类型更改被视为一种