天天看點

黑盒測試《等價類劃分》-有這篇就夠了

大家好,我是吉提。在疫情消停不下來的2020年,既然不好跳槽,不好漲薪,也不好發揮創造力,那麼就沉下心來,跟我一起,鞏固軟體測試基礎知識。積攢力量,蓄勢待發。

本文将會較長的描述“等價類劃分",它是黑盒測試最基本的用例設計方法。

目錄:

  1. 定義(What)
  2. 為什麼使用該方法?(Why)
  3. 如何劃分等價類?(How)
  4. 設計測試用例
  5. 使用場景
  6. 根據測試用例的完整性劃分
  7. 等價類劃分注意事項
  8. 等價類劃分的優缺點
  9. 實戰演練

1. 定義(What)

等價類劃分法是一種典型的,并且是最基礎的黑盒測試用例設計方法。采用等價類劃分法時,完全不用考慮程式内部結構,設計測試用例的唯一依據是軟體需求規格說明書。

所謂等價類,是輸入條件的一個子集合,該輸入集合中的資料對于揭示程式中的錯誤是等價的。從每一個子集中選取少數具有代表性的資料,進而生成測試用例。

等價類又分為有效等價類和無效等價類。有效等價類代表對程式有效的輸入,而無效等價類則是其他任何可能的輸入(即不正确的輸入值)。有效等價類和無效等價類都是使用等價類劃分法設計用例時所必須的,因為被測程式若是正确的,就應該既能接受有效的輸入,也能接受無效輸入的考驗。

2. 為什麼使用該方法?(Why)

理想的測試,是從所有可能的輸入中找出某個小的子集,并且是可能發現錯誤最多的子集。即:使用最少的測試資料,達到最好的測試品質(最高成本效益)。

這個子集如何确定?可以借助測試用例的兩個特性:測試用例數量達到最少;某個測試用例要能覆寫大部分其他測試用例。第二個特性就暗示我們,應該盡量将程式輸入範圍進行劃分,将其劃分為有限數量的等價類,這樣就可以合理地假設測試每個等價類的代表性資料等同于測試該類的其他任何資料。這兩種特性形成了稱為等價類劃分的黑盒測試方法。

是以,等價類劃分是黑盒測試最基本的方法。

3. 如何劃分等價類?(How)

在給定了輸入或外部條件之後,等價類的劃分原則如下:

  • 如果輸入條件規定了一個取值範圍(例如,“數量可以是1到999”),那麼就應确定出一個有效等價類(1<數量<999),以及兩個無效等價類(數量<1,數量>999)。
  • 如果輸入條件規定了取值的個數(例如,“汽車可登記一至六名車主”),那麼就應确定出一個有效等價類和兩個無效等價類(沒有車主,或車主多于六個)。
  • 如果輸入條件規定了一個輸入值的集合,而且有理由認為程式會對每個值進行不同處理(例如,“交通工具的類型必須是公共汽車、卡車、計程車、火車或機車”),那麼就應為每個輸入值确定一個有效等價類和一個無效等價類(例如,“拖車”)。
  • 如果存在輸入條件規定了“必須是”的情況,例如“辨別符的第一個字元必須是字母”,那麼就應确定一個有效等價類(首字元是字母)和一個無效等價類(首字元不是字母)。
  • 以上是基于字面上的需求劃分的等價類,而細化等價類依據的是資料在記憶體或資料庫中存儲的類型。(舉例,測試加法器,兩個文本框,要求輸入-99~99之間的整數。整數的存儲在計算機底層中會使用不同的算法,正整數和負整數算法不同。是以測試時正整數和負整數應該分開來測(一般對有效等價類資料應用,無效等價類資料一般不需要正、負分别測)。是以将有效等價類細分為:-99--(-1)負整數、0—99 正整數。

Tips:如果有任何理由可以認為程式并未等同地處理等價類中的元素,那麼應該将這個等價類再劃分為小一些的等價類。

劃分等價類的标準:
  • 完備測試、避免備援;
  • 劃分等價類重要的是:集合的劃分,劃分為互不相交的一組子集,而子集的并是整個集合;
  • 并是整個集合:完備性;
  • 子集互不相交:保證一種形式的無備援性;
  • 同一類中辨別(選擇)一個測試用例,同一等價類中,往往處理相同,相同處理映射到"相同的執行路徑"。

4. 設計測試用例

Step1.确定等價類

确定等價類是選取每一個輸入條件(通常是規格說明中的一個句子或短語)并将其劃分為兩個或更多的組。注意,我們确定了兩類等價類:有效等價類代表對程式的有效輸入,而無效等價類代表的則是其他任何可能的輸入條件(即不正确的輸入值)。這樣,我們就遵循了測試原則,即要注意無效和未預料到的輸入情況。

Step2.建立等價類表

劃分等價類後,應建立等價類表,列出與每一個輸入條件對應的有效等價類和無效等價類,并為每個等價類設定一個唯一的編号。

Step3.生成測試用例

現在利用等價類表來生成測試用例,其過程如下:

  • 編寫新的測試用例,盡可能多地覆寫那些尚未被涵蓋的有效等價類,直到所有的有效等價類都被測試用例所覆寫(包含進去)。
  • 編寫新的用例,每次覆寫一個(僅一個)尚未被涵蓋的無效等價類,直到所有的無效等價類都被測試用例所覆寫(包含進去)。

Tips:用測試用例每次隻覆寫1個無效等價類,是因為某些特定的輸入錯誤檢查可能會屏蔽或取代其他輸入錯誤檢查。舉例,如果規格說明規定了“請輸入書籍類型(硬皮、軟皮或活頁)及數量(1~999)”,代表兩個錯誤輸入(書籍類型錯誤,數量錯誤)的測試用例“(XYZ,0)”,很可能不會執行對數量的檢查,因為程式也許會提示“XYZ是未知的書籍類型”,就不檢查輸入的其餘部分了。

5. 使用場景

有資料輸入(編輯框)的地方,可以使用等價類劃分法。例如使用者登入、注冊、建立、查詢。

6. 根據測試用例的完整性劃分

日常逼叨叨:解釋一下啥叫根據完整性劃分。測試用例沒有完美的,不是必須列到多少條才叫100分,再怎麼測試都不可能找出所有bug。測試行為是一個精益求精的過程,100分是理想國,測試工程師以這個理想國為目的地,始終在朝拜它的路上,不問何時抵達,隻求更接近一步。設計測試用例的目的,圖的就是有邏輯得有規律得找出更多bug,那麼就有理由認為,測試用例設計的越完整,邏輯性就越強,考慮得就越周到,就可以找出更多bug。小王設計4條用例,小張在這4條基礎上,又增加了3條,一共設計7條,那麼小張的測試用例一定比小王的更完整。

完整性從弱到強排序:弱一般等價類測試、弱健壯等價類測試。強一般等價類測試、強健壯等價類測試。下面逐一定義。

  • 弱一般等價類:遵循單缺陷原則,要求用例覆寫每一個變量的一種取值即可,取值為有效值。
  • 弱健壯等價類:在弱一般等價類的基礎上,增加取值為無效值的情況。“健壯”意味着程式要有容錯性,取到無效值也要正确識别出來。對于有效輸入,使用每個有效值類的一個值。對于無效輸入,測試用例将擁有一個無效值,并保持其餘的值是有效的。
  • 強一般等價類:遵循多缺陷原則,要求用例覆寫每個變量的每種取值之間的迪卡爾乘積,即所有變量所有取值的所有組合,取值為有效值。例如變量X有3個等價類,變量Y有2個等價類,那麼應設計3*2共6個用例。要覆寫所有的有效等價類組合。
  • 強健壯等價類:在強一般等價類的基礎上,增加取值為無效值的情況。(不僅取單個無效值,也要取多個無效值。)

7. 等價類劃分注意事項

不僅要針對輸入域進行等價類劃分,也應針對輸出域進行等價類劃分(見“實戰演練”的“三角形問題”),這點一定不要忘記了!此外,如果考慮将端到端場景進行細分,等價類劃分法同時也适用于中間過程的輸入、輸出域進行劃分。

8.等價類劃分的優缺點

  • 優點:等價類劃分的測試用例設計方法減少了窮舉法帶來的大量測試用例,保證測試效果和測試效率,一般是有輸入性需求的被測對象可以采用的方法;
  • 缺點:輸入與輸入之間的關系考慮少,可能産生一些邏輯錯誤。還需要其他用例設計方法來補充測試。

9.實戰演練

例1.注冊郵箱

郵箱名要求6~18個字元,可使用字母、數字、下劃線、需以字母開頭。

黑盒測試《等價類劃分》-有這篇就夠了

例2. 三角形問題

程式要求:輸入三個整數a、b、c分别作為三角形的三邊長度,通過程式判定所構成的三角形的類型;當三角形為一般三角形、等腰三角形或等邊三角形時,分别作處理。

<問題分析>

  • 輸入值域的顯/隐式要求:A整數、B三個、C正數、D兩邊之和大于第三邊、E三邊均不相等、F兩邊相等但不等于第三邊、G三邊相等;(D~G由輸出值域的等價類隐性确定)
  • 輸出值域的等價類:R1={不構成三角形}、R2={一般三角形}、R3={等腰三角形}、R4={等邊三角形};

<問題解答>

(1)列出等價類表并編号

黑盒測試《等價類劃分》-有這篇就夠了

(2)設計覆寫有效等價類的測試用例

(3)設計覆寫無效等價類的測試用例

例3.NextDate 函數

函數包含三個變量:month 、 day 和 year ,函數的輸出為輸入日期後一天的日期。 例如,輸入為 2020年3月 7日,則函數的輸出為 2020年3月8日 。要求輸入變量 month 、 day 和 year 均為整數值,并且滿足下列條件:1≤month≤12,1≤day≤31,1920≤year≤2050。

<問題分析>

該函數的主要特點是輸入變量之間的邏輯關系比較複雜,具體展現在:輸入域的複雜性;閏年規則。如,變量year和變量mouth取不同值時,對應的變量day會有不同的取值範圍,或1~30或1~31或1~28或1~29。

<問題解答>

(1)劃分等價類

等價關系的要點是:等價類中的元素要被“同樣處理”,即要麼都在有效層次上進行,要麼都在無效層次上進行。是以,更詳細地有效等價類為:

  • 變量mouth:M1={mouth: mouth有30天}、M2={mouth: mouth有31天,除去12月}、M3={mouth: mouth是2月}、M4={mouth: mouth是12月};
  • 變量day:D1={day: 1≤day≤28}、D2={day: day=29}、D3={day: day=30}、D4={day: day=31};
  • 變量day:Y1={year: year是閏年}、Y2={year: year是平年}。

(2)一般等價類測試

  • 弱一般等價類測試

考慮到單邊假設,機械地以對稱方式來選擇對應類的有效輸入:

  • 強一般等價類測試

從弱等價類測試到強等價類測試,不管是一般類還是健壯類,都做要獨立性假設,都要以等價類的笛卡爾積表示。

在本問題中,變量mouth等價類數量為4、變量day等價類數量為4、變量year等價類數量為2,故強一般等價類測試用例數量為4*4*2=32。

(3)健壯等價類測試

  • 弱健壯等價類測試
  • 強健壯等價類測試

-end-

黑盒測試《等價類劃分》-有這篇就夠了