论文提出基于static partial evaluation of the decisions in the source code和源码到字节码的映射程序,实现软件覆盖率分析。
软件分析通常利用代码覆盖率信息来推理软件的动态行为。 覆盖率信息描述了源代码中的结构元素,如已经执行(覆盖)的路径、函数、语句和分支。 覆盖率信息被用来评估测试的充分性,执行测试用例的选择和优先权,以及测试套件的最小化。 它还被用于其他软件维护任务,如预测故障可能性和故障定位
尽管结构性代码指标是在源代码层面上定义的,但它们是在编译后的代码执行过程中测量的,例如,Java字节码。 现有的最先进的技术是通过监控被插桩字节码的执行来计算代码覆盖率,以确定哪些覆盖率义务得到满足。 插桩包括在字节码的战略位置插入 "跟踪 "语句,这取决于覆盖率指标。 然后,当字节码指令被执行时,插桩有助于跟踪相应源代码中被执行(覆盖)的部分。
插桩有两个缺点
- 开销
- 影响正常逻辑
本文提出了一种新的预处理方法,该方法基于static partial evaluation of the decisions in the source code和源码到字节码的映射程序。 不需要instrumentation。 覆盖率指标的跟踪是通过使用任何能够监测指令流的工具来完成的,比如一个被插桩的JVM或一个软件验证工具,如Java PathFinder。 文中使用Symbolic PathFinder工具来跟踪覆盖率指标,计算覆盖的义务集,并生成覆盖义务的测试用例。
Background
对于一个测试套件,最常见的标准定义如下
语句覆盖率:要求程序中的每个语句至少被执行一次。
分支覆盖率:要求程序中的每个条件分支(如'if'语句)至少有一次评估为真和假。
决策覆盖率。决策覆盖率要求每个决策的评估结果都是真和假。
修改后的决策/条件覆盖(MC/DC)。 MC/DC要求(1)程序中的每个入口和出口点至少被调用过一次, (2)程序中决策的每个条件(不包含布尔运算符的布尔表达式)至少有一次可能的结果, 以及(3)每个条件被证明能独立影响决策的结果。
Preprocessing
这边是实际的设计,没有仔细看