1、语句覆盖
语句覆盖的目的是测试程序中的代码是否被执行,它只测试代码中的执行语句,这里的执行语句不包括头文件、注释、空行等
使每个执行语句至少被执行一次,语句覆盖属于弱覆盖,没有办法测试程序中的逻辑错误。
2、判定覆盖(分支覆盖)
比语句覆盖强大一些,其原则是设计足够多的测试用例,在测试过程中保证每个判定至少有一次为真值,有一次为假值。
3、条件覆盖
原则:设计足够多的测试用例,使判定语句中的每个逻辑条件取真值与取假值至少出现一次。
4、判定条件覆盖
原则:设计足够多的测试用例,使得判断语句中所有条件的可能取值至少出现一次,同时,所有判定语句的可能结果也至少出现一次。
测试用例
测试用例 | x | y | z | 条件标记 | 条件1 | 条件2 | 执行路径 |
---|---|---|---|---|---|---|---|
test1 | 3 | 1 | 5 | S1、-S2、S3、S4 | 0 | 1 | abe |
test2 | -3 | 1 | -1 | -S1、-S2、-S3、-S4 | 0 | 0 | abd |
test3 | 3 | -1 | 1 | S1、S2、S3、-S4 | 1 | 1 | ace |
5、条件组合覆盖
条件组合指的是设计足够多的测试用例,使判定语句中每个条件的所有可能至少出现一次,并且每个判定语句本身的判定结果也至少出现一次,它与判定-条件覆盖的差别是,条件组合覆盖不是简单的要求每个条件都出现“真”与“假”两种结果,而是要求让这些结果的所有可能组合都至少出现一次
依然用S1、S2、S3、S4标记这四个条件的取值情况,由于这四个条件每个条件都有取“真”,“假”两个值,因此所有条件结果的组合有2^4=16种
6、程序插桩
程序插桩就是往测试程序中插入测试代码以达到测试目的的方法,插入的测试代码被称为探针。根据侧测试代码插入的时间可以将插桩法分为目标代码插桩和源代码插桩
目标代码插桩
原理:在程序运行平台和底层操作系统之间建立中间层,通过中间层检查执行程序、修改指令,开发人员、软件分析工程师等对运行的程序进行观察,判断程序是否被恶意攻或者出现异常行为,从而提高程序的整体质量。
执行模式
即时模式
原始的二进制或可执行文件没有被修改或执行,将修改部分的二进制代码生成文件副本存储在新的内存区域中,在测试时仅执行修改部分的目标代码
解释模式
在解释模式中目标代码被视为数据,测试人员插入的测试代码作为目标代码指令的解释语言,每当执行一条目标代码指令,程序就会在测试代码中查找并执行响应的替代指令,测试通过替代指令的执行信息就可以获取程序的运行信息。
探测模式(没有前两种用的多)
探测模式使用新指令覆盖旧指令进行测试,这种模式在某些体系结构(如X86)中比较好用
目标代码插桩工具
pin
DynamoRIO
源代码插桩
原理:对源文件进行完整的词法、语法分析后,确认插桩的位置、植入探针代码,相比于目标代码插桩,更具有针对性和精确性。不需要插桩工具,测试代码具有很好的通用性。