最近软件测试学习的重点,应该就要算
Software Faults, Errors & Failures的基本概念和对它们之间区别的理解了
我个人对这三个概念是这么理解的
Faults:静态代码中存在的错误,和程序是否运行无关,一个程序存在Faults只能代表这个程序有错,不能代表这个程序被运行的时候一定会出错
Errors :程序在运行的过程中,运行到了存在Faults的代码时,而产生的一种异常的中间状态。首先,这种状态是临时的,不会长时间存在;其次,error不是一定会导致Failures,但是如果代码运行过程中没有error就一定不会Faults
Failures:程序中的Faults被执行之后,程序出现过Error状态之后,可能导致的程序运行失败的最终结果,这个结果有可能是结果错误,有可能是运行异常。
我理解的三者之间的关系是这样的:如果代码中没有Faults,那么运行时一定不会出现Errors,如果运行中没有出现Errors那么最后的程序运行结果一定不会是Failures。但是这句话反过来说不一定成立。
这一点和软件测试本身很相似,软件测试只能证明错误存在,却没有部分证明错误不存在。
下面来说一下本周的两道作业题:
public int findLast (int[] x, int y) { //Effects: If x==null throw // NullPointerException // else return the index of the last element // in x that equals y. // If no such element exists, return -1 for (int i=x.length-1; i > 0; i--) { if (x[i] == y) { return i; } } return -1; } // test: x=[2, 3, 5]; y = 2 // Expected = 0
这段代码的功能是从一个数组中找最后一个值等于y的元素
很明显,我们能发现这段代码的for循环没有循环数组的第一个元素,这就是这段代码的Fault
如果我们想要找一组测试数据不执行一开始的for循环,那么也只有当输入的x数组为空时,抛出空指针异常了
执行Fault但是不进入Error状态的一种情况就是在倒序循环数组元素时,在数组第一个元素之前找到y的位置,比如说x={1,2,3},y=3,最后都返回2
进入Error状态但是没有出现Failure,就是说程序的运行结果没错,一种简单的情况就是数组中不存在我要查找的元素值,如x={1,2,3},y=4,最后都返回-1,代表没有找到
public static int lastZero (int[] x) { //Effects: if x==null throw // NullPointerException // else return the index of the LAST 0 in x. // Return -1 if 0 does not occur in x for (int i = 0; i < x.length; i++) { if (x[i] == 0) { return i; } } return -1; } // test: x=[0, 1, 0] // Expected = 2
第二小题的代码也很简单寻找数组中的最后一个0的位置,但是实际功能却变成了寻找第一个0,这个就是这段代码的Fault
不执行Fault的测试用例还是一个空指针的数组
执行Fault但是不进入Error状态的一种情况比较难想,因为这段代码和代码原来的意思是完全相反的,所以说只有数组只有唯一一个元素的时候如,x={0},返回0
进入Error状态但是没有出现Failure,一种情况是数组里面的0小于等于1个,如x={1,2,3},返回-1