一、单元测试
1.单元测试是对软件的基本组成单元进行的测试,如函数、类或类的方法。
单元测试是对软件的最小可测试单元(即可独立编译或汇编的程序模块)进行的测试活动,也称为模块测试
二、白盒测试方法
实例代码
public static int test(int a,int b,int c) {
1 int result = 0;
2 if(a == 0 or b > 2) {
3 result = b - a;
}
4 if(a > 0 and c > 0 ) {
5 result = c * a;
}
6 return result;
}
流程图
1)语句覆盖
语句覆盖法是指设计适当数量的测试用例,使被测程序中的每条语句至少被执行一次。
语句覆盖率的计算方法为:至少被执行一次的语句数量 / 程序中可执行的语句总数
语句覆盖可以使程序中的语句都被测试到,但是它也是覆盖最弱的一种逻辑覆盖方法,无法发现程序中的很多逻辑错误
2)分支(判定覆盖)
分支覆盖,也叫判定覆盖,是指运行代码进行测试时,程序中的所有判定语句的真、假分支至少都被执行过一次。
分支覆盖率的计算方法为:测试时覆盖到的判定语句真、假分支的总数 / 程序中判定语句真、假分支的总数
分支(判定)覆盖比语句覆盖的的覆盖效果要强一些,但是分支(判定)覆盖可能还是无法发现程序中的一些逻辑错误
3)条件覆盖
条件覆盖法是指设计适当数量的测试用例,运行被测程序,使得程序中每个判断语句中条件的真、假分支至少被执行一次(复合条件要拆分)
但是,满足了条件覆盖也不能保证所有的分支都已经得到覆盖
4)分支-条件覆盖
指运行代码进行测试时,程序中所有判断语句中的条件取值为真、取值为假的情况和整个判断语句取真分支、假分支的情况都被覆盖到(即,至少被执行过一次)
无法覆盖所有路径
5)条件组合覆盖
要求让每个条件为真、为假情况所有可能的组合都至少被执行一次
满足了条件组合覆盖也不能保证所有的路径都已经得到覆盖
6)路径覆盖
程序中的所有路径都至少被执行一次
但对于包含多且复杂的判断语句、循环语句的程序来说,要覆盖每一条路径将会非常困难
7)基本路径覆盖
基本路径覆盖法是在程序控制流图的基础上,通过分析控制结构的圈复杂度,导出基本可执行的路径集合设计测试用例,运行被测程序,使程序的基本路径都得到覆盖。
控制流图中如果含有复合条件,需要改为单条件嵌套的形式
V(G) = A + 1,其中 A 代表控制流图中的封闭区域数量。从下图可以看出,程序的控制流图中共有 4 个封闭区域,所以,圈复杂度 V(G) = 4 + 1 = 5 。
V(G) = P + 1,其中 P 代表控制流图中的判定节点数
V(G) = e - n + 2,其中 e 代表控制流图中的边的数量,即控制流中的箭头数量;n 代表控制流图的节点数量,即控制流图中的圆圈数量
圈复杂度是指程序中的独立路径数量,是确保程序中每个可执行语句至少执行一次需要的测试用例数量的最小值
可以使程序中的每条独立路径都至少执行一次。如果程序中的基本路径达到了 100% 覆盖,则分支(判定)覆盖、条件覆盖也能达到 100% 覆盖。
8)简单循环测试
简单循环是最简单的循环,即只有一个循环且没有嵌套,例如,一个 while 循环、一个do-while 循环、一个 for 循环
简单循环的测试用例需要考虑下列几种情况(设最大循环次数为 n ):
(1)循环 0 次:测试跳过整个循环的场景;
(2)循环 1 次:目的是检查循环的初始值是否正确;
(3)循环 2 次:目的是检查多次循环是否正确;
(4)循环 m 次(其中 2 < m < n - 1):目的是检查多次循环是否正确
5)循环 n - 1 次:目的是检查边界值是否正确;
(6)循环 n 次:目的是检查边界值是否正确;
(7)循环 n + 1 次:目的是检查边界值是否正确。
9)嵌套循环
是指一个循环语句的循环体内含有其他的循环语句的语法结构
按简单循环的方法对最内层循环进行测试,其他循环次数设置为最小值
2)由内向外逐步对每一层循环进行测试,直到所有各层循环都测试完成。测试时将当前循环的所有外层循环的循环次数设置为最小值,所有内层循环的循环次数设置为典型值;
3)对各层循环同时取最小循环次数进行测试,如果有最大次数,再同时取最大循环次数进行测试
10)串接循环
是指两个或多个循环连接在一起的循环结构,也称连锁循环
第二种串接循环是各个循环体之间有关联关系,第二个循环的输入来自于第一个循环的输出,对于这种串接循环,我们可以考虑使用嵌套循环的测试方法来进行测试。
按简单循环的方法对下层循环进行测试,其他循环次数设置为最小值;
2)由下至上逐步对每一层循环进行测试,直到所有循环都测试完成。测试时将当前循环的所有上层循环的循环次数设置为最小值,所有下层循环的循环次数设置为典型值;
3)对各层循环同时取最小循环次数进行测试,如果有最大次数,再同时取最大循环次数进行测试。