Liam的軟件測試學習歷程(二):查找錯誤的兩道例題

觀察兩段代碼並回答下列問題:測試

(1) 發現錯誤代碼;spa

(2) 試着編寫測試用例,不執行fault部分;code

(3) 執行fault部分,但不出現error狀況;blog

(4) 出現error狀況,但不發生failure。element

 

代碼一:io

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

(1) for循環的終止條件應該爲i<=0;for循環

(2) x=[],y=2;ast

這裏因爲x爲空,因此不進入for循環,直接返回NullPointerException;class

Excepted:NullPointerException,test

Actual:NullPointerException

(3) x=[1,2,3],y=2;

這裏最後一個等於y的值不在x[0]處,而在x[1],因此for循環並無執行到"i>=0"的條件出,因此不會出現error狀態;

Excepted:1,

Actual:1;

(4) x=[3,4,5],y=2;

 這裏雖然執行到了error情況,但因爲x中並無與y相等的值,因此獲得結果是正確的,因此沒有出現failure;

Excepted:-1,

Actual:-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

(1)for循環執行的方向反了,不該該由i=0開始執行,而應該是從x.length-1開始遞減;

(2)這裏不管如何代碼都會執行進入for循環,因此不存在這樣的樣例;(這裏與上一題不一樣的地方在於,上一問中的fault是for循環的一個判斷條件,當x爲空時,for循環在執行第一步對i賦值是便會出現NullPointerException,進而不會執行到fault;而這一問中的fault是整個for循環,因此只要進入for循環就屬於進入了fault中)

(3)x=[1];這裏執行時會進入for循環,即進入了fault,可是因爲x中只有一個元素,因此不存在循環執行的正反問題,因此沒有error狀態;

Excepted:-1,

Actual:-1;

(4)x=[1,0,2];這裏代碼執行時會發生error狀態,可是因爲x中只有一個0,因此不管是正着執行for循環仍是倒着執行,都不會對結果產生影響,因此沒有發生failure;

Excepted:1,

Actual:1。

相關文章
相關標籤/搜索