準則: 測試設計
這個準則說明如何識別和設計測試。
關係
主要說明

說明

對於使用者的軟體滿意度,最大的影響莫過於清楚掌握使用者預期的項目,以便針對這些預期進行驗證。測試案例反映將要驗證的需求。不過,這些需求的驗證,可能是由不同的測試者進行,驗證方式也可能各不相同。例如,執行軟體來驗證軟體功能和效能,可由測試者利用自動化測試技術來進行,電腦系統的關機序列可藉由手動測試和觀察來進行,巿場佔有率和銷售額(包括產品需求)則是藉由測量產品和競爭銷售額來完成。

由於您可能無法(或負責)驗證所有需求,因此,為了順利完成專案,請務必選取最適當或最重要的需求來進行測試。您選擇要驗證的需求,將是成本、風險及需求驗證之必要性的平衡。

基於許多種原因,識別測試案例非常重要。

  • 測試案例形成了測試 Script 的設計和開發基礎。
  • 測試的「深度」與測試案例的數目成比例。測試案例的數目越多,產品和測試流程的品質信任度也越高,因為每個測試案例都反映了不同的情境、狀況或產品流程。
  • 測試完成度主體測量的涵蓋面是基於需求,而以所識別、實作和/或執行的測試案例數目為基礎。「我們的關鍵測試案例已執行和驗證了 95 %」之類的陳述式,比「我們已進行了測試的 95%」重要。
  • 測試工作的等級與測試案例的數目成比例。綜合性地分析測試案例之後,可以更精確預估測試循環後續階段的計時。
  • 測試設計和開發的類型以及所需要的資源,會受到測試案例的高度支配。

測試案例通常是依相關測試的測試類型或需求來分類,且會據此而有所不同。作法是測試的每項需求各開發至少兩個測試案例:

  • 一個測試案例示範已完成的需求。這稱為正面測試案例。
  • 另一個測試案例反映不可接受的、異常的或非預期的狀況或資料,它示範需求只在合意的狀況下完成,稱為負面測試案例。

衍生單元測試的測試案例

單元測試需要單元內部結構及其行為特性這兩方面的測試。測試內部結構必須瞭解單元的實作方式,以這項知識為基礎的測試稱為白盒測試。測試單元的行為特性,焦點在於單元外部可觀察的行為,與實作的知識無關。以這種方式為基礎的測試稱為黑盒測試。以下說明以這兩種方式為基礎來衍生測試案例。

理論上,您應該測試程式碼的所有可能的路徑。這個目標,在全部但非常簡單的單元中,若非不切實際,就是不可能完成。您最起碼應該每個決策至決策路徑(DD 路徑)至少處理一次,因而所有陳述式都至少執行一次。決策通常都是一個 if 陳述式,DD 路徑則是兩項決策之間的路徑。

如果要取得這個層次的測試涵蓋面,建議您將測試資料選成每項決策都能夠在每一種可能的方式之下進行評估。為了做到這一點,測試案例應該確定:

  • 每個布林表示式都得出 truefalse。例如,(a<3) OR (b>4) 這個表示式會得出 true/false 的四種組合。
  • 每個無限迴圈都操作至少零次、一次,以及不只一次。

請利用程式碼涵蓋面工具來識別您的白盒測試尚未處理的程式碼。可靠性測試應該與白盒測試同時進行。

範例:

假設您執行 Set of Integers 類別 member 函數的結構測試。在二分搜尋法的協助之下,這項測試會檢查集合中是否包含給定的整數。

標題所說明的圖。

成員函數及相對應的流程圖。帶點箭頭說明如何利用兩個測試案例來執行所有陳述式至少一次。

理論上,作業若要完整測試,測試案例應該遍歷程式碼中的所有路徑組合。在成員中,迴圈內有三個替代路徑。測試案例可以遍歷迴圈許多次,或完全不遍歷迴圈。如果測試案例完全不遍歷迴圈,您只會發現一個程式碼路徑。如果它遍歷迴圈一次,您會找到三條路徑。如果它遍歷兩次,您會找到六條路徑,依此類推。因此,路徑的總數是 1+3+6+12+24+48+...,實際上,這是一個無法管理的路徑組合數目。正因為如此,您必須選擇所有這些路徑的子集。在這個範例中,您可以利用兩個測試案例來執行所有陳述式。在一個測試案例中,您可以選擇 Set of Integers = {1,5,7,8,11}t = 3 來作為測試資料。在另一個測試案例中,您可以選擇 Set of Integers = {1,5,7,8,11}t = 8

請參閱技術:單元測試,以取得其他資訊。

黑盒測試

黑盒測試的用途是驗證單元的指定行為,且不必去看單元如何實作這個行為。黑盒測試焦點在單元的輸入和輸出,同時也依賴這個輸入和輸出。

等值分割是一項減少所需測試數量的技術。您應該識別每項作業的引數和物件狀態的等值類別。等值類別是一組預期物件會有類似行為的值。例如,Set 有三個等值類別:空白某個元素全滿

請利用程式碼涵蓋面工具來識別您的白盒測試尚未處理的程式碼。可靠性測試應該與黑盒測試同時進行。

下兩小節說明如何選取特定引數的測試資料來識別測試案例。

基於輸入引數的測試案例

輸入引數是作業所用的一個引數。您應該針對下列每個輸入條件,使用每項作業的輸入引數來建立測試案例:

  • 每個等值類別的正常值。
  • 每個等值類別的界限值。
  • 等值類別外的值。
  • 不合法的值。

請記得將物件狀態當作輸入引數來處理。比方說,如果您測試 Set 物件的 add 作業,您就必須利用 Set 所有等值類別的值來測試 add,也就是說,利用全滿的 SetSet 中的某個元素,及空白的 Set 來進行測試。

基於輸出引數的測試案例

輸出引數是作業所改變的引數。引數可以同時是輸入和輸出引數。請選取輸入,以便根據下列各項來取得輸出

  • 每個等值類別的正常值。
  • 每個等值類別的界限值。
  • 等值類別外的值。
  • 不合法的值。

請記得將物件狀態當作輸出引數來處理。比方說,如果您測試 Listremove 作業,您必須選擇輸入值,使得 List 在執行作業(利用所有 等值類別的值來進行測試)之後,成為全滿、具有某個元素和空白。

如果物件是用狀態來控制(反應會隨著物件的狀態而不同),您應該使用如下圖的狀態矩陣。

標題所說明的圖。

測試的狀態矩陣。您可以依據這個矩陣來測試狀態和刺激因素的所有組合。

請參閱技術:單元測試,以取得其他資訊。