MiLu:一个可定制、运行时优化、高阶的C语言变异测试工具;
1. MiLu:C语言变异测试工具
1、一阶 + 高阶变异测试
2、之前的工具是将所有可能的变异算子应用到测试中;而MiLu可以指定应用到测试中的变异算子;
3、为减少运行时开销,MiLu使用“测试治理(test harness)”技术将变异体和测试集嵌入到测试程序中。
2. background介绍了现有的一些变异测试工具。其中for C的有:Proteum(开源) + Plextest/Isure++(商业化)
3. Muli的基本功能:根据指定变异算子生成变异体 + 根据给定的测试集执行变异程序 + 报告变异scores(一个衡量测试集充分性的量)
4. Muli的体系结构:
5. Muli变异测试的有效性。
Abstract
- MiLu:C语言变异测试工具
1、一阶 + 高阶变异测试
2、之前的工具是将所有可能的变异算子应用到测试中;而MiLu可以指定应用到测试中的变异算子;
3、为减少运行时开销,MiLu使用“测试治理(test harness)”技术将变异体和测试集嵌入到测试程序中。
Introduce
- 变异测试:p + 变异算子 = p’;变异算子执行1次为一阶变异体(FOMs);多次为高阶变异体(HOMs);
- FOMs:p’杀死 + 存活 + 测试集T的充分等级
- HOMs:比一阶更难杀死;
- MiLu采用了77种变异算子 + 可定制变异算子
Background
现有的变异测试工具简单介绍:
- 变异测试在1987年提出
- 开源的有:
1、Mothra for Fortran;
2、Proteum for C;
3、mujava for java;
4、PesTer for Python;
5、Nester for C#;
6、SQLMutation for SQL
- 商业化产品:7
1、Plextest for C++;
2、Isure++ for C and C++;
3、certitude for 功能性测试
MiLu体系结构
- MiLu提供的两组变异测试模式——一阶变异测试模式:
1、:预定义的变异算子 + 自己定制的变异算子
2、MiLu做的工作:生成变异体 + 执行给定的测试机 + 报告变异分数; - MiLu提供的两组变异测试模式——高阶变异测试模式
1、用户可以选择预定义的搜索优化算法,也可以指定他们自己的算法和合适的函数来查找分类的HOMs;
2、分类的HOMs也能应用到FOMs;
3、MiLu提供了良好的界面和API,研究人员可以通过这些API编写成圣和评估变异体的插件; - MiLu的体系结构
1、包含三个部分(都提供了相应的接口供用户扩展相应组件的特点):
①、源码分析器(SCA):是一个C语言解析器,以C代码为输入,将C代码解析成token列表;为了支持子序列变异算子的定制,不只是语法、上下文信息也会被保存。SCA也会根据这些语法构建成相应的抽象语法树(AST)。
②、编译系统(MTS):MTS以AST和变异算子为输入生成变异体模板; + 每一个变异体被表示成整形向量Mutation ID;变异模板用来生成Mutation ID。
③、测试和评估系统(TES):执行变异体程序;将MTS中的变异体传给GCC编译器,GCC编译器并不是将它编译成可执行的程序,而是编译成共享的类库 + 为了优化执行开销,使用“测试治理”,它能通过调用共享库的变异体动态调用测试用例。
Flexibility
MiLu允许用户使用一种脚本语言来定制变异算子来增强MiLu的灵活性。
- MiLu为用户提供了一个脚本语言——变异算子约束脚本语言(MOCS)来制定变异算子,MOCS为任何编译算子添加约束。约束类型包括两种:直接替代约束 + 环境条件约束;
- 直接替代约束:允许用户选择一个指定的转换规则来执行替代,例如== 替换成 = ,而不用在被替换成><啊其它的了(简单但是灵活性高)
- 环境条件约束:在特定的范围内指定变异算子操作而不用针对整个程序。例如只替代if语句中的操作算子:[if]ORRE,可以跟直接替代约束一起使用。
Efficiency
使用其他变异测试工具的优化技术和引入“测试治理”技术来优化MiLu的执行、
- 现有的优化技术有:
1、基于解释器技术:小规模的变异可行,大的就不适用;
2、基于编译器技术:效率比1高但是会引入额外开销;
3、基于突变模式技术:减少了2的额外开销,速度上比2高效。
(前三者都是对编译时到的优化) - 最新的优化技术十针对运行时而非编译时
1、MiLu中,一个测试治理包含了所有的测试用例和相应的设置,每一个变异体被编译成一个共享的类库,这些类库能被测试治理动态调用,只需执行测试治理,变异体程序被当做函数来调用。
2.这种方法比运行每一个变异体效率高很多。