Transcript Document

基于覆盖分析和符号执行的自
动化测试用例生成方法研究
庄元
指导教师:陈道蓄 教授,顾庆 教授
南京大学计算机科学与技术系
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
引言
 软件测试
 测试用例设计
 根据指定的测试用例进行符号执行
 根据执行结果判断可靠性
 自动化
 可行性
 成本
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
自动化测试用例生成
 系统构成
 程序分析器
 路径选择器
 测试数据生成
方法
 随机测试
 基于搜索的测试
 符号执行
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
符号执行
 使用符号变量,而不是实际的程序变量,来执行程
序,程序的输出结果往往是由符号变量构成的符号
函数,程序的中间状态也是由符号变量来进行表示。
相关定义
 程序的状态
 程序变量的符号值,路径条件和程序计数器
 路径条件
 一个基于符号变量输入的布尔表达式
 程序计数器
 下一个要执行的语句标号
 符号执行树
 描述在符号执行过程中走过的所有的路径
符号执行树
经典符号执行
组件
 代码插桩
 在给定的被测代码中插桩额外的代码用于收集信息,
例如程序的状态
 程序执行
 对被测代码进行符号模拟执行,就是对符号执行树的
搜索遍历
 约束解决
 解决工具对符号执行过程中采集到的约束进行求解
动态符号执行
例子
拓展符号执行
 抽象
 指通过约减程序的数据域,从而降低针对程序分析的
复杂度
 组合符号执行
 归纳函数的输入输出上下文,将嵌套函数的分析转为
单一函数的分析
 路径归并
 引入归并点,同抽象进行结合进一步减少复杂度
一些成果
 JPF-SE 和 Symbolic (Java) PathFinder
 DART
 Directed automated random testing
 CUTE 和 jCUTE
 Concolic Testing
 CREST
 PEX
 Microsoft
其他应用




测试序列生成
运行时错误的静态检测
修复程序和数据结构
并行程序分析
 并行程序 转为 串行程序
 Differential 符号执行
 计算版本变更,用于回归测试的测试用例集维护
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
框架
模块
 覆盖信息生成
 通过输入的测试用例集和源代码生成覆盖矩阵
 覆盖信息分析
 根据代码覆盖信息,生成符号执行所必须的代码以及
配置信息
 符号执行
 符号执行给定代码,按照配置要求求解路径约束条件,
生成新的测试用例
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
Jabolic 架构
一些组件




Symbolic PathFinder
Cobertura
Junit
CoverageAnalyzer
 输入:xml格式的覆盖信息
 输出:Java Path Finder友好的配置信息
CoverageAnalyzer
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
实验设计
 代码样本
 随机测试
 Randoop
 符号执行
 SPF
 基于覆盖分析和符号执行的方法
 Jabolic
实验结果
随机测试
符号执行
Jabolic
讨论
 初始测试用例选取对实验结果的影响
 随机测试时间的选择对实验结果的影响
 影响实验的其他因素
提纲







引言
自动化测试用例生成
基于符号执行的测试用例生成
基于覆盖分析和符号执行的测试用例生成方法
Jabolic 的设计与实现
实证研究
总结与展望
总结展望
 考虑规模更大的实验对象
 开源代码
 大规模
 完善 Jabolic
 源代码插桩
 图形界面
谢谢