在上一篇文章中我们提到了这三者的区别,当然我们不但要能分清它们,根据测试case知道它究竟触发到哪个或哪几个,我们还要进行逆向思维,在给出程序的情况下要能根据需求设计测试case,今天我们就结合课后作业一起来看看。
一.题目1
1 public int findLast (int[] x, int y) { 2 //Effects: If x==null throw NullPointerException 3 // else return the index of the last element 4 // in x that equals y. 5 // If no such element exists, return -1 6 for (int i=x.length-1; i > 0; i--) 7 { 8 if (x[i] == y) 9 { 10 return i; 11 } 12 } 13 return -1; 14 } 15 // test: x=[2, 3, 5]; y = 2 16 // Expected = 0
1.找到程序中的Fault:
Fault:循环条件出错,for循环中i应该大于或等于0而不是大于0;
2.设计一个未执行Fault的测试用例:
x=null;y=2;
3.设计一个执行Fault,没有触发Error的测试用例:
数组x的第一个元素不是与y相等的唯一的元素即可避免Error,如x=[4,2,3,4,5];y=4;
4.设计一个触发Error,但不导致Failure的测试用例:
当数组只有一个元素的时候,循环无法进行,返回-1,触发Error。但若x中唯一的元素与y不相等,则Failure不会产生。如x=[2];y=3.
二.题目2
1 public static int lastZero (int[] x) { 2 //Effects: if x==null throw NullPointerException 3 // else return the index of the LAST 0 in x. 4 // Return -1 if 0 does not occur in x 5 for (int i = 0; i < x.length; i++) 6 { 7 if (x[i] == 0) 8 { 9 return i; 10 } 11 } return -1; 12 } 13 // test: x=[0, 1, 0] 14 // Expected = 2
1.找到程序中的Fault:
Fault:循环错误,程序为从前往后遍历,若找到一个0就返回,不能保证是最后的,应改为从后往前遍历,即 :for (int i=x.length-1; i >= 0; i--);
2.设计一个未执行Fault的测试用例:
显然,未改正之前不能找到这样的例子,以为int i=0一定会执行;
3.设计一个执行Fault,没有触发Error的测试用例:
当x=null时执行fault且会抛出异常,但不会触发error;
4.设计一个触发Error,但不导致Failure的测试用例:
若数组中有一 个元素为零,则会触发错误但不会失败,例如:x=[1,2,0,3].
好了,经过上面两道例题的分析和解答,相信大家对fault,error和failure已经能完全区分并学会逆向思维找到对应的测试案例了,在软件测试技术的道路上又迈开了新的步伐。