1. 程式人生 > >軟體測試的幾個術語(故障--Fault、錯誤--Error、失效--Failure)

軟體測試的幾個術語(故障--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,通過最終結果與完美程式碼的結果(或者說預期結果)的一致性體現出來。

由於個人能力有限,編不出合適的例子,本例借鑑於其他博主,本人又加以拓展和思考,若有錯誤,歡迎指正!