蘇晶
(山東理工大學,山東 淄博255049)
軟件測試是軟件開發過程中的重要組成環節,是發現軟件缺陷和提高軟件質量的重要舉措。其中,在系統功能測試過程中,通常以用戶需求為側重點完成對系統功能的確認和驗證,因此需采用黑盒測試技術完成測試用例的設計任務。
等價類劃分法和邊界值分析法是應用最為普遍的黑盒測試方法,分別可以實現“合理分類、精心挑選”,兩者雙劍合璧,可以達到較好的測試效果。但是這兩種方法通常只適用于輸入條件相互獨立的情況,如果輸入條件之間存在聯系,則很難描述,即使描述出來,其測試效果也難以保障。
因果圖分析法給出了行之有效的解決方案,該方法可以通過簡單、直觀的圖形化符號,完整準確的確定輸入條件組合和輸出結果之間的邏輯關系,進而依據一定的規則推導并設計出判定表和測試用例,從而實現對輸入條件組合等復雜情況的完備測試。
本文以某系統的注冊問題為例,展示因果圖分析法的一般過程和設計要點。
注冊問題的測試需求描述如下:
(1)用戶名為必填項;
(2)密碼長度大于4 位小于8 位,可以由純字母、純數字或者字母加數字組成;
(3)確認密碼必須與密碼完全一致。
系統依次判斷,如果輸入均有效,則給出“注冊成功”的提示。如果輸入有誤,則系統分別給出“請輸入用戶名”、“密碼輸入有誤”和“確認密碼輸入有誤”的錯誤提示信息。
從上述需求描述可以看出,注冊問題中的多個輸入條件組合能夠產生不同的輸出結果,并且輸入條件間存在依賴關系,并非完全獨立,因此根據應用場景,需選擇因果圖分析法和判定表驅動法完成測試用例的設計。
因果圖中的原因是指輸入條件的有效等價類,即用戶對該系統能夠輸入或者執行的操作所需滿足的一般規則。
(1)如果輸入條件為簡單條件,比如用戶名為必填項,則選擇其有效等價類“用戶名填寫”作為原因即可。
(2)如果輸入條件為復合條件,則為了確保測試的充分性,必須將輸入條件拆分為簡單條件,比如密碼長度大于4 位小于8 位,則拆分為兩個原因,即“密碼長度大于4 位”和“密碼長度小于8 位”。
因果圖中的結果是預期輸出或者輸出的有效等價類,即系統對用戶輸入所能產生的所有響應,一般為界面的切換、系統的錯誤提示等。結果的分析相對較為簡單,大部分情況可以從測試需求中直接獲取,比如給出“密碼輸入有誤”的錯誤提示。只有當預期輸出為海量數據時,才需要從系統給出的所有響應中提取共性,分析預期輸出的有效等價類。
由于因果圖最擅長處理輸入條件和預期輸出均為邏輯值的情況,因此提供的原因和結果間的關系是傳統意義上的邏輯關系。
原因和結果間一對一的關系只包括兩種情況,即恒等和非,所有輸入情況的分析是“非真即假”的。也就是說,對于一個輸入條件只能劃分出一個符合輸入條件的有效等價類和一個違反輸入條件的無效等價類。顯然這種處理方法對于復合條件而言是欠妥當的,比如輸入條件為密碼長度大于4 位小于8 位,取非后表示為“密碼長度小于等于4 位或者大于等于8 位”,在判定表中通過0 值表示,最后階段也只能選取“小于等于4 位”或者“大于等于8 位”中的一種情況來設計測試用例,顯然該測試方案出現了關鍵信息的遺漏,無法保證測試的完備性。
而將復合條件拆分后,每個原因都被描述為簡單條件,大部分情況下是一個關系表達式,采用“非真即假”的設計方案,不存在上述遺漏現象,可以保證測試的完備性。
針對此類問題,等價類劃分法的處理更為靈活一些。該方法不會假定輸入條件為邏輯值,有效等價類和無效等價類之間也不是“非真即假”的關系,會根據不同的應用場景選擇不同的等價類設計方案,即使不做拆分,測試的完備性也能得到保證。
由于因果圖分析法和判定表驅動法最擅長處理邏輯值的情況,因此在分析問題時,應盡可能將原因和結果描述為條件表達式或邏輯表達式的形式。
通過分析,注冊問題的原因描述如下:
C1- 用戶名填寫;C2- 密碼長度大于4 位;C3- 密碼長度小于8 位;C4- 密碼由純字母組成;C5- 密碼由純數字組成;C6-密碼由字母和數字組成;C7- 確認密碼與密碼完全一致。
注冊問題的結果描述如下:
E1- 請輸入用戶名;E2- 密碼輸入有誤;E3- 確認密碼輸入有誤;E4- 注冊成功。
在完成對原因和結果的標識與描述后,需深入分析軟件規格說明中的語義,找出原因與結果之間、原因與原因之間對應的關系,并根據這些關系畫出因果圖[1]。
(1)因果圖分析法分析問題的一般方式為,從每個結果入手,分析其如何產生,即結果與原因間存在怎樣的關系;
(2)如果結果間沒有遞進關系,通常選擇從最簡單的結果開始分析,也可隨意選擇分析順序;如果結果間存在遞進、嵌套等依賴關系,則必須按照一定的輸入順序進行分析。
注冊問題中系統依次對用戶輸入進行判斷,一旦用戶名輸入無效,則密碼和確認密碼沒有機會得到驗證,因此需按順序進行分析,并在因果圖繪制過程中,將用戶名輸入有效作為密碼和確認密碼驗證的基礎要求和前提條件。
中間結果的確定通常是因果圖繪制的一大難點,對于一個描述明確的測試需求而言,通常原因和結果是確定的,而中間結果則相對較為模糊,需要花費大量時間進行深入分析。
通常情況下,如果在分析原因和結果的過程中,為了保證測試的充分性,將一個復合輸入條件拆分成了多個簡單條件,則繪制因果圖時,需反其道而行之,通過增加中間結果將其合并起來,為后續分析的順利進行做好準備工作。
比如對于原因“密碼長度大于4 位”和“密碼長度小于8位”,需創建一個中間結果“密碼長度有效”,通過與關系將兩者合并起來。對于原因“密碼由純字母組成”、“密碼由純數字組成”和“密碼由字母和數字組成”,需創建一個中間結果“密碼字符類型有效”,通過或關系將三者合并起來。
除此之外,以下情況也可創建中間結果:
(1)多個輸入條件間存在更為緊密的依賴關系,考慮增加中間結果;
(2)一個結果與多個原因間存在關系,但并非純粹的與/或關系,需要增加中間結果;
(3)多個輸入條件間存在遞進關系,或者某個輸出以某個輸入作為前提條件,必須增加中間結果。
因果圖繪制過程中,原因和結果必須是完備的,而中間結果的確定并無唯一的標準答案:
(1)為了后續分析的順利進行,以及減少不必要的交叉線,可以適當增加中間結果,甚至允許出現多層嵌套的中間結果;
(2)如果去除中間結果后,繪制出的因果圖無任何歧義或錯誤,整張圖美觀、易于閱讀,且與測試需求描述完全一致,則中間結果可有可無。
在因果圖分析過程中,不僅要考慮輸入和輸出之間的邏輯關系,還需考慮輸入因素之間或輸出結果之間的互相制約及依賴關系。由于語法或環境的限制,有些原因和結果的組合情況是不合理或不存在的,因此繪制因果圖的最后一步需分析這種特殊情況,并通過標準的符號標明約束條件。
輸入條件的約束主要包括以下三類[2]:
(1)E(Exclusive)互斥關系:表示多個輸入條件至多有一個成立。
(2)I(Inclusive)包含關系:表示多個輸入條件至少有一個成立。
(3)O(Only One)唯一關系:表示多個輸入條件有且只有一個成立。
對于“密碼由純字母組成”、“密碼由純數字組成”和“密碼由字母和數字組成”三個與密碼字符類型有關的原因而言,不可能有兩個或以上的條件同時成立。但從用戶輸入角度出發,若三者同時不成立,則表示密碼包括非字母非數字符號,為密碼不合法的情況,因此三個原因間應建立互斥約束。
通過以上的分析推導過程,注冊問題的因果圖已創建完畢,如圖1 所示。后續可以此為依據,按照一定的規則將其轉換為判定表,并設計測試用例完成對系統的功能測試。

圖1 注冊問題的因果圖
軟件測試是發現軟件缺陷和提高軟件質量的重要手段。在系統功能測試過程中,對于輸入條件組合的復雜情況,因果圖分析法是行之有效的測試用例設計方案。因果圖分析法充分考慮了輸入條件之間及輸入條件與輸出結果之間的各種組合關系,能夠對非常復雜的功能邏輯進行分析,因此所生成的測試用例具有較高的覆蓋率,測試效果能夠得到保障;另外,該方法不僅對各種組合關系進行了深入分析,還對各種約束規則作出了定義,規避了大量的無效數據,有效提高了測試的效率和有效性;與此同時,該方法能夠規范測試用例設計的過程,還有助于發現軟件規格說明書中所存在的問題[3]。
因果圖分析法的短板主要體現在對非邏輯值的處理上。該方法并非不能處理非邏輯值的輸入條件和預期輸出,但相對而言,若存在非邏輯值,則因果圖的繪制會較為復雜,準確進行問題分析也會較為困難。因此通常將輸入和輸出描述為邏輯值的形式,雖然在復合條件處理上存在一定的局限性,卻能大幅度降低因果圖分析的問題難度,便于測試用例的設計,提高測試的效率和有效性。