软件测试分为单元测试、集成测试、系统测试、性能测试,这篇文章主要讲单元测试,那么什么是单元测试呢,单元测试主要面对的是一个小模块,可以是一个函数、一段代码、一个类等模块化的测试,将代码分成一部分来测试,单元测试又分成静态测试和动态测试,静态测试主要是检查代码格式,比如说
if(true){ System.out.println("我是Java静态测试的代码"); }这段代码,语法是否通过;早些时候主要由人工靠眼力来观察,现在许多的代码编辑工具已经有自动提示的功能,比如说Java的eclipse就有代码提示,如果不符合,还可以通过快捷键来一键解决。小编刚出道的时候,就使用过Parasoft软件进行动态测试和静态测试。
接下来我们要讲动态测试啦,动态测试可以说是单元测试最重要的一部分了,有许多的测试方法,比如说语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖和路径覆盖。
这几种方法中,小编认为语句覆盖是最简单的啦,只要让每个语句至少被执行一次就行啦,以下面的流程图为例,把每条语句执行一次,过程就是s-a-c-b-e-d,这就是语句覆盖,选好了这个过程之后,我们就要开始设计用例啦,也就是设置参数的值,如何才能让程序按s-a-c-b-e-d这个顺序走,小编设计了一个用例,大家可以参考一下
输入:
a=2,b=1,c=6;输出:
a=2,b=1,c=5;当然啦,最简单的方法肯定会有缺陷,比如说我们设置a=0,这个时候程序就会报错,但是以我们的之前的那个用例来说,这个语句覆盖达到了100%之后,一般就不会再进行多次的测试,这个bug就会潜伏在我们的程序中。
定义:选取足够多的测试数据,使被测试程序中不仅每个语句至少执行一次,而且每个判定的每种可能的结果都至少执行一次。
判定覆盖中的判定指的是下图种a菱形里面的那一块,不仅要让它往下走,而且还要让它往右边走,显然一个用例是不可能覆盖的。这个时候我们来看下设计用例:
1.s-a-c-b-e-d和s-a-b-d
2.s-a-c-b-d和s-a-b-e-d
我们只需要选取1或者2一组设计用例就可以啦,满足判定覆盖啦。但是还是不能测试出a=0的时候这种情况,所以判定覆盖也不是十分完美。
说明:以上仅考虑了两出口的判断,我们还应把判定覆盖准则扩充到多出口判断(如Case语句)的情况。因此,判定覆盖更为广泛的含义应该是使得每一个判定获得每一种可能的结果至少一次。我们可以看下,这个有多少个用例,可以看出来有12个。
定义:选取足够多的测试数据,使每个判定表达式中的每个条件都取到各种可能的结果。
其实就是把判定覆盖里面的那几个条件拆分之后
a点:a>0, a<=0,b>0,b<=0;
b点:a>1,a<=1,c>1,c<=0;
1、a=2,b=-1,c=-2(s-a-b-e-d)——–>(a>0,b<=0,c<=0)
输出:a=2,b=-1,c=-2
2、a=-1,b=2,c=3(s-a-b-e-d)——–> (a<=0,b>0,c>1)
输出:a=-1,b=2,c=6
可以看到,条件覆盖选取的是两个一样的路径,如果只选择了条件覆盖,其中的a=0还是不能够测试到,而隐含的bug依旧在其中。所以接下来看下面的条件组合覆盖
定义:选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的结果,而且每个判定表达式也都取到各种可能的结果。
1、a=2, b=1, c=6 (s-a-c-b-e-d) 输出a=2,b=1,c=5
2、a=-1, b=-2, c=-3 (s-a-b-d) 输出a=-1,b=-2,c=-5
定义:选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。
如何理解这句话呢,就是将判定里面的各个条件拆分然后组合到一起,请看下面的例子:
有八种可能的条件组合:
1、a>0,b>0 2、a>0,b<=0
3、a<=0,b>0 4、a<=0,b<=0
5、a>1,c>1 6、a>1,c<=1
7、a<=1,c>1 8、a<=1,c<=1
测试数据:
1、a=2, b=1, c=6 (s-a-c-b-e-d , 1,5)
输出:a=2,b=1,c=5
2、a=2, b=-1, c=-2 (s-a-b-e-d , 2,6)
输出:a=2,b=-1,c=-2
3、a=-1, b=2, c=3 (s-a-b-e-d , 3,7)
输出:a=-1,b=2,c=6
4、a=-1, b=-2, c=-3 ( s-a-b-d, 4,8)
输出:a=-1,b=2,c=6
各位小伙伴们,你还能看得出有哪些组合
A>0B>0A>1C>1TTTT1,5TTTF1,6TTFT1,7TTFF1,8TFTT2,5TFTF2,6TFFT2,7TFFF2,8FTTT3,5FTTF3,6FTFT3,7FTFF3,8FFTT4,5FFTF4,6定义:路径覆盖:选取足够多的测试数据,使得程序的每条可能路径都至少执行一次(若程序图中有环,则每个环至少经过一次)。
路径覆盖就是每条璐都走一次,设计用例,如果说油循环,那就设置让他至少走一次。
1、a=2, b=1, c=6 (?, 1,5)
输出 a=2,b=1,c=5
2、a=2, b=-1, c=-2 (?, 2,6)
输出 a=2,b=-1,c=-2
3、a=-1, b=2, c=3 (?, 3,7)
输出a=-1,b=2,c=6
4、a=-1, b=-2, c=-3 (?, 4,8)
输出 a=-1,b=-2,c=-5
5、a=1,b=1,c=-3 ( ?, 1,8)
输出 a=1,b=1,c=-2
接下来就是总结的时刻啦,正如前面所说的那样,语句覆盖是最简单的,但是覆盖的范围也是最低的,条件组合覆盖的范围比较广,但是我们可以看到,条件组合覆盖需要设计的用例是比较多而,小编仅仅是举了一个简单小栗子,真正的软件测试不是这一个流程图就完了,想想微软公司Windows系统,这些代码恐怕一个人一辈子也看不完。
条件组合覆盖需要设计的用例是比较多而,小编仅仅是举了一个简单小栗子,真正的软件测试不是这一个流程图就完了,想想微软公司Windows系统,这些代码恐怕一个人一辈子也看不完。