大家好,我是吉提。在疫情消停不下來的2020年,既然不好跳槽,不好漲薪,也不好發揮創造力,那么就沉下心來,跟我一起,鞏固軟件測試基礎知識。積攢力量,蓄勢待發。
本文將會詳細描述“等價類划分",它是黑盒測試最基本的用例設計方法。
目錄:
- 定義(What)
- 為什么使用該方法?(Why)
- 如何划分等價類?(How)
- 設計測試用例
- 使用場景
- 根據測試用例的完整性划分
- 等價類划分注意事項
- 等價類划分的優缺點
- 實戰演練
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-