解决方案
基于对问题 1) 和问题 2) 的原理分析,我们设计并实施了回归测试的解决方案,如下图所示。它包含了 3 个主要步骤。一是测试用例的录入;二是对新旧两个版本的变更分析;三、通过测试用例优化选择和覆盖率分析,得到相应的测试用例优化选择报告,和覆盖率分析报告。
图 5. 回归测试解决方案
步骤一, Trace Test Case 负责录制测试用例,并将捕获到的测试用例的 Runtime Trace 存放到数据库中;
测试用例在后台运行中的 Runtime Trace 是动态分析 (Dynamic Analysis) 中的重要信息。这些实际的运行信息为测试用例的优化选择和覆盖率分析创造了条件。下面是测试用例跟踪的框架图:
图 6. 测试用例跟踪的框架图
从上图我们可以看出,测试人员触发 Trigger 之后,会启动 Agent Controller 。 Agent Controller 一直对 JVM 中的 JVMTI 进行监听,以获取部署在 JVM 上的被测应用程序。这些 Agent Controller 还负责将收集到的数据传输给 Data Collector 。又 Data Collector 将这些 Runtime Trace 写入如下表所示的数据库表中。
Case ID | Package | Class | Method | Signature |
001 | com.ibm.crl.orts.action | DeleteCommodityAction | Delete | ([Ljava/lang/String;)V |
001 | com.ibm.crl.orts.action | DeleteOrderAction | Delete | |
002 | ...... | |||
003 | ...... | ...... | ...... | ...... |
注意:函数的 Signature 信息作为函数的参数标识也需要记录下来。以区别同名不同参数的函数。
步骤二, Change Analysis 用于将新旧两个版本作比较,得到 Change Report,即程序变更报告,可以精确到 Method 粒度。一般来说代码变更有 4 种级别,分别为包级别 (Package),类级别 (Class),函数级别 (Method) 及语句级别 (Statement) 。
对于包级别和类级别来说,比较的力度过粗,会影响到回归测试优化的质量。而函数级别和语句级别都能起到很好的回归测试的作用。其中语句级别因为粒度最细,等到的分析结果也最精确,回归测试质量最高。但与函数级别的变更分析相比,回归测试的质量相差很有限,但造成了过多的执行时间代价,影响了回归分析的效率。因此我们采用函数级别的变更分析作为回归测试的变更粒度。
确定比较粒度之后,可以选择分析比较的方法。最简单的常用比较方法就是文本比较。包括源代码和可执行文件 (binary code) 的文本比较。根据 Java 语言面向对象的特点,还可以采用基于面向对象分析的比较方法。后者得到的分析粒度更细,但是所花的代价也越高。
步骤三, 在通过测试用例录制得到测试用例具体的 Runtime Trace 信息,以及通过 Change 分析得到新旧两个版本的变更信息之后,我们可以对测试用例优化问题及覆盖率分析问题进行求解。
原文转自:http://www.uml.org.cn/Test/200903313.asp