準則: 等值類別分析
等值類別分析是將測試案例數縮到最小的技術。這個準則說明這項技術是什麼,以及如何使用它。
關係
主要說明

簡介

除了最沒有價值的軟體應用程式,一般而言,是不可能針對軟體系統來測試所有在邏輯上可能的輸入組合。因此,好的子集是最可能找到最大多數錯誤的子集,選取好的子集是非常值得測試人員執行的重要作業。

基於等值類別分析的測試(同義字:等值分割領域分析),在形式上,是一種黑盒測試分析,它試圖將可能的測試總數減少到既能彰顯儘可能多的錯誤,卻又是規模最小的一組測試 [MYE79]。它是將輸入和輸出的集合分割成數量有限之等值類別的方法,使您能夠針對每個類別來選取具代表性的測試值。從類別的代表值產生的測試,便稱為「相等」於相同類別中的其他值。如果在代表值的測試中找不到任何錯誤,就推斷所有其他「相等」的值也不會發現任何錯誤。

等值類別的力量,在於它們能夠利用取樣策略來引導測試,以減少潛在必要測試組合爆增的情況。這項技術提供一個邏輯基礎,供您選取可信測試總數的其中一部分。以下是一些可能因為考量等值類別而受益的大量測試之問題領域種類:

  1. 自變數的組合
  2. 基於階層式關係的因變數
  3. 基於時間關係的因變數
  4. 基於行銷範例的叢集關係
  5. 可建模的複雜關係

策略

等值分割測試可以使用不同的策略和技術。以下是一些範例:

等值類別分割

Glenford Myers [MYE79] 所提出的等值分割理論,試圖將輸入條件分割成有限數量的等值類別來減少必要的測試案例總數。等值類別可分成兩個類型:程式的整組有效輸入屬於有效等值類別,所有其他輸入都包括在無效等值類別中。

以下是一組識別等值類別的準則:

  1. 如果輸入條件指定了某個值範圍(例如,程式「接受 10 到 100 的值」),便識別一個有效的等值類別(從 10 到 100)和兩個無效的等值類別(小於 10 和大於 100)。
  2. 如果輸入條件指定一組值(如「軟布可以有許多顏色:RED、WHITE、BLACK、GREEN、BROWN」),便識別一個有效的等值類別(有效值)和一個無效的等值類別(任何其他無效的值)。有效等值類別的每個值都應該個別處埋。
  3. 如果輸入條件指定為「必須是」的狀況(如「輸入字串必須是大寫」,便識別一個有效的等值類別(大寫字元)和一個無效的等值類別(大寫字元以外的所有其他輸入)。
  4. 在作業完成之前已完成「很久」的每個項目都是等值類別。在程式完成之前某段短的時間間隔內完成的每個項目都是另一個類別。在程式剛要啟動另一項作業之前完成的每個項目都是另一個類別。
  5. 如果程式指定成要使用 64M 到 256M 的記憶體,這個大小範圍便是一個等值類別。任何大於 256M 或小於 64M 的其他記憶體大小都可以接受。
  6. 輸出事件的分割便在於程式的輸入中。即使不同的輸入等值類別可以有相同類型的輸出事件,您仍應該用不同的方式來處理輸入等值類別。

界限值分析

在每個等值類別中,界限條件都被認為成功識別失敗結果的比率高於非界限條件。 界限條件是在界限上,緊接在界限上下的值或每個等值類別「邊緣」的值。

界限條件產生的測試會使用需要測試之範圍的最小值 (min)、只大於最小值的值 (min+)、只小於最大值的值 (max-) 及最大值 (max)。當測試界限值時,測試人員會針對每個等值類別來選擇少數幾個測試案例。如果是相對小的測試範例,發生失敗的可能性就很高。對於在測試結果中不太會產生太大差別的值,測試人員可以從它的等值類別龐大的移入案例測試負荷中,得到某種程度的緩和解脫。

以下是選擇界限值時的建議事項:

  1. 關於浮點變數,如果它的有效條件是 -1.01.0,請測試 -1.01.0-1.0011.001
  2. 關於整數,如果有效輸入範圍是 10100,請測試 910100101
  3. 如果程式預期大寫字母,請測試界限 A 和 Z。另外,也請測試 @[,因為在 ASCII 碼中,@ 緊接在 A 之下,[ 緊接在 Z 之外。
  4. 如果程式的輸入或輸出是排定次序的集,請注意集中的第一個和最後一個元素。
  5. 如果輸入的總計必須是特定數字 (n),請測試總計是 n-1nn+1 的程式。
  6. 如果程式接受清單,請測試清單中的值。所有其他值都無效。
  7. 當讀取或寫入檔案時,請檢查檔案的第一個和最後一個字元。
  8. 最小的錢幣單位是一分或對等單位。如果程式接受特定範圍 a 到 b,請測試 a -0.01 和 b +0.01
  9. 如果是含有多個範圍的變數,每個範圍都是一個等值類別。如果各個子範圍不重疊,請測試在界限上、超出上界及低於下界的值。

特殊值

嘗試了上面兩個界限分析策略之後,有經驗的測試者會觀察程式的輸入來找出任何「特殊值」的情況,這些也可能是可供發現軟體失敗的豐富來源。以下是一些範例:

  1. 對於整數類型,如果是在有效等值類別內,便一律應該測試零。
  2. 當測試時間(小時、分鐘和秒鐘)時,不論輸入變數有何限制,一律應該將 59 和 0 當作每個欄位的上下限來測試。因此,除了輸入的界限值,-1、0、59 和 60 一律應該是測試案例。
  3. 當測試日期(年、月和日)時,應該包含許多測試案例,例如,特定月份的天數、閏年二月份天數、非閏年天數。

「種類分割」方法

Ostrand 和 Balcer [16] 開發了一種分割方法來協助測試人員分析系統規格、撰寫測試 Script 和管理它們。他們的方法不同於焦點往往放在程式碼的一般策略,但也是以規格和設計資訊為基礎。

這個方法的主要好處是能夠在撰寫程式碼之前顯露錯誤,因為輸入來源是規格,測試是來自這項規格的分析。它能夠及早發現規格錯誤,通常會早在程式碼實作這些規格之前。

以下是「種類分割」方法的策略:

  1. 分析規格:將系統功能拆解成功能單元,以便由規格和實作來個別測試。
    請從其中:

    1. 識別會影響功能之執行的參數和環境狀況。參數是功能單元的輸入。環境狀況是會影響功能單元之執行的系統狀態。
    2. 識別參數和環境狀況的特性。
    3. 將特性分成會影響系統行為的不同種類。

    這個階段會發現行為的不明確、矛盾和遺漏說明。

  2. 將種類分割成選項:選項是不同的可能狀態,它們也許會發生,且並不在預期中。它們代表種類中相同類型的資訊。

  3. 判斷選項之間的關係和限制。不同種類的選項會互相影響,結果會影響測試套組的建置。加入限制是為了消除不同參數和環境的選項之間的矛盾。

  4. 根據種類、選項和限制資訊來設計測試案例。如果選項造成錯誤,請勿將它與其他選項結合起來,以建立測試案例。如果某個選項可以由單一測試來「適當」測試,它就是選項的代表或特殊值。

進一步的閱讀和參照

  1. Glenford J. Myers, The Art of Software Testing, John Wiley & Sons, Inc., New York, 1979.
  2. White L. J. and Cohen E. I., A domain strategy for computer program testing, IEEE Transaction on Software Engineering, Vol. SE-6, No. 3, 1980.
  3. Lori A. Clarke, Johnhette Hassell, and Debra J Richardson, A Close Look at Domain Testing, IEEE Transaction on Software Engineering, 8-4, 1992.
  4. Steven J. Zeil, Faten H. Afifi and Lee J. White, Detection of Linear Detection via Domain Testing, ACM Transaction on Software Engineering and Methodology, 1-4, 1992.
  5. BingHiang Jeng, Elaine J. Weyuker, A Simplified Domain-Testing Strategy, ACM Transaction on Software Engineering and Methodology, 3-3, 1994.
  6. Paul C. Jorgensen, Software Testing - A Craftsman's Approach, CRC Press LLC, 1995.
  7. Martin R. Woodward and Zuhoor A. Al-khanjari, Testability, fault, and the domain-to-range ratio: An eternal triangle, ACM Press New York, NY, 2000.
  8. Dick Hamlet, On subdomains: Testing, profiles, and components, SIGSOFT: ACM Special Interest Group on Software Engineering, 71-16, 2000.
  9. Cem Kaner, James Bach, and Bret Pettichord, Lessons learned in Software Testing, John Wiley & Sons, Inc., New York, 2002.
  10. Andy Podgurski and Charles Yang, Partition Testing, Stratified Sampling, and Cluster Analysis, SIGSOFT: ACM Special Interest Group on Software Engineering, 18-5, 1993.
  11. Debra J. Richardson and Lori A. Clarke, A partition analysis method to increase program reliability, SIGSOFT: ACM Special Interest Group on Software Engineering, 1981.
  12. Lori A. Clarke, Johnette Hassell, and Debra J Richardson, A system to generate test data and symbolically execute programs, IEEE Transaction on Software Engineering, SE-2, 1976.
  13. Boris Beizer, Black-Box Testing - Techniques for Functional testing of Software and System, John Wiley & Sons, Inc., 1995.
  14. Steven J. Zeil, Faten H. Afifi and Lee J. White, Testing for Liner Errors in Nonlinear computer programs, ACM Transaction on Software Engineering and Methodology, 1-4, 1992.
  15. William E. Howden, Functional Program Testing, IEEE Transactions on Software Engineering, Vol. SE-6, No. 2, 1980.
  16. Thomas J. Ostrand and Marc J. Balcer, The Category-Partition method for specifying and generating functional tests, Communications of ACM 31, 1988.
  17. Cem Kaner, Jack Falk and Hung Quoc Nguyen, Testing Computer Software, John Wiley & Sons, Inc., 1999.