軟體測試的幾個術語(故障--Fault、錯誤--Error、失效--Failure)
1.解釋
Fault--故障
編碼過程中,存在於軟體中的靜態缺陷 (Defect)
Error--錯誤
軟體執行過程中,執行fault後,觸發得到的結果(錯誤)。
Failure--失效
失效。error傳到軟體外部,使用者和測試人員能夠觀測的到的失效行為。
指不完全符合給定的需求,實際結果或行為與期望結果或行為之間的偏差。
當一個系統不能執行所要求的功能時,即為Failure
觀測到Failure的三個必要條件【PIE模型】
Execution/Reachability-執行:執行必須通過錯誤的程式碼
Infection-感染:在執行錯誤程式碼的時候必須觸發出一個錯誤的中間狀態
Propagation-傳播:錯誤的中間狀態必須傳播到最後的輸出,使得觀測到輸出結果與預期結果不一致
ps:
一個測試執行到包含fault的程式碼,不一定會產生錯誤的中間狀態error
產生了錯誤的中間狀態,不一定會有失效failure
question:有沒有一個fault,任何測試都不會將其測試出來?這樣還能稱之為fault嗎?answer:有這樣的fault
2.例子
public int findLast (int [ ] x,int y) { // Effects: If x is null throw NullPointerException // else return the index of last element in x that equals y. // if no such element exists,return -1. int count = 0; for (int i = x.length-1; i > 0 ; i--) { if (x [ i ] == y) { return i; } } return -1; }
這個題目要求我們在陣列中從後往前找到匹配期望值的索引,但是在for迴圈中,由於當i = 0時候沒有滿足 i>0的條件,無法遍歷到 i = 0,所以實際上沒有比對第一個數。這就是我們的Fault。
1.當測試用例為 test:x = [] 時,丟擲空指標異常,此時沒有執行下面的程式,所以沒有執行fault。
2.當測試用例為 test:x = [2,3,5], y = 3 的時候
期望值:1 實際值:1 同時由於我們在 i = 1的時候,正確返回。所以我們雖然執行了含有fault的程式,但是並沒有產生錯誤,所以 執行了fault,沒有執行error。
3.當測試用例為 test:x = [2,3,5],y = 1的時候
期望值:-1 實際值:-1 雖然我們得到了正確的結果,但是按照設計,應該在遍歷完x = 0 以後,返回 -1;而實際程式在遍歷完x = 1之後直接返回了 -1,所以 執行了fault,產生了error,但沒有出現failure。
4.當測試用例為 test:x = [2,3,5],y = 2的時候
期望值:0 實際值:-1 我們得到了與預期不一致的結果,按照設計,應該在遍歷完x = 0 以後,返回 0;而實際程式在遍歷完x = 1之後直接返回了 -1,所以 執行了fault,產生了error,也產生了failure。
3.個人理解
是否執行Fault,取決於是否執行了出現Fault的語句。
是否執行Error,不容易把握。先針對程式碼原本要完成的功能,在腦海裡預想一個完美的程式碼。然後對比那個完美程式碼和存在Fault的程式碼在輸入相同的測試樣例的時候,看它們在執行期間狀態是否一致。
是否執行Failure,通過最終結果與完美程式碼的結果(或者說預期結果)的一致性體現出來。
由於個人能力有限,編不出合適的例子,本例借鑑於其他博主,本人又加以拓展和思考,若有錯誤,歡迎指正!