一、等價類划分法
該方法是將系統的輸入域划分為若干部分,然后從每個部分選取少數代表性數據進行測試,這樣可以避免窮舉法產生的大量用例。
等價類是指某個輸入域的子集合,在該子集合中,各個輸入數據對於揭露軟件中的錯誤都是等效的。並合理地假定:測試某等價類的代表值就等於對這一類其它值的測試。
有效等價類:是指對於系統的規格說明來說是合理的,有意義的輸入數據構成的集合。利用有效等價類可以驗證程序是否實現了規格說明中所規定的功能和性能。
無效等價類:是指對於系統的規格說明來說是不合理或無意義的輸入數據所構成的集合。
設計測試用例時,要同時考慮這兩種等價類。因為,軟件不僅要能接收合理的數據,也要能經受意外的考驗,這樣的測試才能確保軟件具備有更高的可靠性。
1、划分等價類
基於特性測試子項所對應的 SRS 片段,可以參考下面幾條原則:
1.在輸入條件規定了取值范圍或值的個數的情況。
例子:在1<x<5中。一個有效等價類:1<x<5,兩個無效等價類:x>=5 和 x<=1。
2.在輸入條件規定了輸入值的集合或者規定了必定如何的條件的情況下,可確立一個有效等價類和一個無效等價類。
例子:規定字段”星期”是輸入星期幾。該輸入條件一個有效等價類是輸入的值屬於從星期一到星期日的集合,一個無效等價類是不屬於星期一到星期日的其他值。
3.在輸入條件是一個布爾量的情況。
例子:性別,如果規定輸入“男”為有效,則一個有效等價類:“男”,一個無效等價類:“女”。
4.在規定了輸入數據的一組值假定 n 個,並且程序要對每一個輸入值分別處理的情況下,可確立 n 個有效等價類和一個無效等價類。
例子:PPT的打印效果分為幻燈片加框和幻燈片不加框,則對於打印效果這個輸入條件,n (這里 n =2)個有效等價類:幻燈片加框,幻燈片不加框;一個無效等價類:加框和不加框外的其他值。
5.在規定了輸入數據必須遵守的規則的情況下,可確立一個有效等價類符合規則和若干個無效等價類從不同角度違反規則。
例子:用戶名規則:長度 6-16 位,由英文和數字組成,則一個有效等價類:符合長度和字符類型的字符串,如 test123。若干個無效等價類可以包括:違反長度,如test1,test1234567890123456,;違反字符類型,如 test@123,test 123等。
6.在確知已划分的等價類中個元素在程序處理中的方式不同的情況下,則應再將該等價類進一步的划分為更小的等價類。
例子:
對於學校考試分數及格(100分制)而言,
有效等價類:大於等於 60 分,無效等效類:小於 60 分,
根據學校相關規定對於分數處理方式不同,可以進一步划分:
有效:60-80 合格,80 分以上 優秀
無效:50-59 分 補考,小於 50 分 重修
2、確定初始用例
從划分出的等價類中按以下三個原則設計測試用例:
1.為每一個等價類規定一個唯一的編號。
2.設計一個新的測試用例,使其盡可能多地覆蓋尚未被覆蓋地有效等價類,重復這一步,直到所有的有效等價類都被覆蓋為止。
3.設計一個新的測試用例,使其僅覆蓋一個尚未被覆蓋的無效等價類,重復這一步,直到所有的無效等價類都被覆蓋為止。
例子:

3、實際應用
等價類划分法主要應用在功能測試,性能測試,GUI測試,配置測試等類型中。
性能測試,比如針對 Word 打開文檔的時間進行測試,可以考慮用 Word 打開純文字的文檔,打開全是圖片的文檔,打開全是表格文檔,打開文字、圖片、表格混合的文檔。
GUI 測試,比如針對下圖中的文件名編輯框輸入回的測試,可以考慮輸入文件名長度小於編輯框的長度,輸入文件名長度大於編輯框長度,輸入英文字母,輸入中文漢字,輸入的中文漢字在編輯框邊沿等等,這就是等價類划分。
配置測試,比如針對網頁在不同瀏覽器上的工作進行測試,通過分析這些瀏覽器的技術實現,IE、遨游、MyIE 等屬於 Trident 內核,可以歸為一類;firefox、mozilla 屬於 Gecko 內核,歸成一類;safari、Chrome 屬於 Webkit 內核,歸成一類。
常見的能夠划分等價類的地方:
數值范圍、重復次數、字符串長度、字符串組中字符串的個數、文件命名、文件大小、可用內存大小、屏幕分辯率、屏幕顏色種類、操作系統版本、超時時間。
總結:等價類是以效果來換取效率,等價類細分程度、等價類組合程度取決於進度和人力資源情況。等價類的出發點是考慮設計用例把每個輸入的每種情況都有用例測試到,就認為達到了充分性。但對於各情況的組合不進行考慮。等價類要想用的好,關鍵是要把輸入背后隱藏的信息從各個角度去進行分類。
二、邊界值分析法
1、邊界值使用條件:
1.輸入條件明確了一個值的取值范圍,或是規定了值的個數。
例子:輸入條件為整數,取值范圍[1,100]
2.輸入條件明確了一個有序集合。
例子:輸入條件為星期幾,取值范圍是星期的集合:星期一到星期日
邊界值點定義:
上點:邊界上的點,如果域的邊界是封閉的(例如閉區間[1,5]),上點就在域范圍內;如果域的邊界是開放的(例如開區間(1,5)),上點就在域范圍外。
離點:就是離上點最近的一個點,如果域的邊界是封閉的,離點就在域范圍外,如果域的邊界是開放的,離點就在域范圍內。
內點:顧名思議,就是在域范圍內的任意一個點。
例子:
88<x<=99 88 89 99 100
上點:88 99
內點:90
離點:89 100
203<=x<500 202 203 499 500
上點:203 500
內點:300
離點:202 499
2、確定測試用例:
1.為每一個等價類內點、上點或離點規定一個唯一的編號。
2.設計一個新的測試用例,使其盡可能多地覆蓋尚未被覆蓋地有效等價類的內點、上點或離點,重復這一步,直到所有的有效等價類點都被覆蓋為止。
說明:等價類划分和邊界值分析結合使用時,邊界值分析的內點如果已經在等價類中有測試用例覆蓋,則無需重復再設計用例。
3.設計一個新的測試用例,使其僅覆蓋一個尚未被覆蓋的無效等價類的內點、上點或離點,重復這一步,直到所有的無效等價類的內點、上點或離點都被覆蓋為止。
3、實際應用:
基於邊界分析方法選擇測試用例的原則:
1.如果輸入條件規定了值的范圍,則應取剛達到這個范圍的邊界的值,以及剛剛超越這個范圍邊界的值作為測試輸入數據。如:重量在 10-50 范圍內的郵件。應取 10 及 50,還要取 10.01,49.99,9.99,50.01等。
2.如果輸入條件規定了值的個數,則用最大個數,最小個數,比最小個數少一,比最大個數多一的數作為測試數據。如:輸入文件包括1-255個記錄。應取 1 和 255,還要取 0 及 256 等。
3.將規則 1 和 2 應用於輸出條件,即設計測試用例使輸出值達到邊界值及其左右的值。如:每月保險金扣除額為 0 至 1165.25 元。應 0.00 及 1165.24,還要取 0.01 及 1165.26等。
4.如果程序的規格說明給出的輸入域輸出域是有序集合,則應選取集合的第一元素和最后一個元素作為測試用例。如:輸入條件為星期幾,如果規定星期日為一周的第一天,則選取測試用例集合第一個元素:星期日,集合最后一個元素:星期六。
5.如果程序中使用了一個內部數據結構,則應當選擇這個內部數據結構的邊界上的值作為測試用例。如:程序采取循環結構,則可以考慮選取循環第 0 次,第 1 次,倒數第 2 次,最后 1 次等。程序采用數組,則可以考慮選取數組第一個元素和最后一個元素等。
6.分析規格說明書,找出其他可能的邊界條件。
總結:邊界值分析法實際上是通過優先選擇不同等價類間的邊界值覆蓋有效等價類和無效等價類來更有效的進行測試,因此該方法需要和等價類划分法結合使用。
三、判定表法
在測試中往往需要考慮多個輸入條件組合的情況,我們可以采取判定表、因果圖、正交實驗等方法。
判定表是分析和表達多種輸入條件下系統執行不同動作的工具。在程序設計發展的初期,判定表就已被當作編寫程序的輔助工具了,它可以把復雜的邏輯關系和多種條件組合的情況表達得既具體又明確。
1、判定表通常由四個部分組成:
1.條件樁:列出了系統的所有輸入,列出的輸入次序無關緊要。
2.動作樁:列出了系統可能采取的操作,這些操作的排列順序沒有約束。
3.條件樁:列出針對它左列輸入的取值,在所有可能情況下的真假值。
4.動作項:列出在輸入項的各種取值情況下應該采取的動作。
例子:手機在未欠費、有信號、開機情況下,可以正常通話。
條件樁:是否欠費、是否有信號、是否開機
條件項:(欠費:是、否)(信號:有、沒有)(開機:是、否)
動作樁:是否正常通話
動作項:正常通話、不能正常通話
5.動作項和條件項一起,指出了在條件項的各種取值情況下應該采取的動作,在判定表中貫穿條件項和動作項的一列就是一條規則,規則是指任何一個條件組合的特定取值及其相應要執行的操作。在判定表中貫穿條件項和動作項的一列就是一條規則。
對於判定表可以進行化簡工作,化簡工作是以合並相似規則為目標的。如果表中有兩條或多條規則具有相同的動作,並且其條件項之間存在極為相似的關系,我們便可以將其合並。

可以針對每個合法輸入組合的規則設計用例進行測試。
2、方法使用步驟
1.標識輸入和輸出
逐項分析測試子項的測試規格,找出其中的輸入和輸出並標識出來,需要注意以下幾點:
1)輸入需要包括外部消息輸入、內部預置的用戶狀態、數據配置等所有對系統輸出有影響的因素;
2)輸入和輸出項只涉及 2 種取值的,可以只做為一個標識出來。如果輸入項涉及多種取值的,每個取值需要做為一個輸入標識出來;
3)標識符可以自己確定,但輸入與輸出需要獨立標識。
2.構造判定表
將標識的輸入填入條件樁部分,將標識的輸出填入動作樁部分。條件項部分的列數為 2 的 n 次方列,n 為輸入數。並從最右列到最左列逐列從“NN......N”到“YY......Y”填入條件項的所有組合。
3.逐列分析條件項組合,填入其動作項
分析每列的條件項取值情況,根據輸入和輸出邏輯關系,得到該列的輸出值為“Y”或“N”,填入該列動作項,得到一條規則。如果該列條件項取值組合不合法,則動作項填入“X”。
4.簡化判定表(可選)
簡化判定表是將相似規則(即表中的列)進行合並,以簡少測試用例,當然它是以犧牲測試用例充分性為代價的。
5.生成測試用例
簡化后的判定表的每一列可以規划為一個測試用例,它的輸入和輸出都已經非常明確。
例子:“……對已運行10年以上的機器、或功率大於50馬力且維修記錄不全的機器,給予全面維修處理,對其它機器只進行一般維修處理”

3、實際應用
判定表法主要針對功能需求中的處理過程,處理過程越是復雜,越有必要使用判定表法。考慮到控制系統以及游戲的處理過程一般比較負責,因此判定表法在控制系統和游戲的測試中應用較多。
四、因果圖法
1、什么是因果圖法
因果圖用於描述系統的輸入輸出、以及輸入和輸出之間的因果關系、輸入和輸入之間的約束關系。因果圖的繪制過程是對被測試系統外部特征的建模過程。根據系統輸入輸出間的因果圖可以得到判定表,從而規划出測試用例。因果圖和判定表兩種方法在實際使用中結合緊密,往往同時使用,此時可以理解因果圖為判定表的前置過程。對於一些簡單的系統,或輸入與輸出已經非常明確的系統,判定表可以單獨使用,如前所述判定表法。
因果圖需要描述下面的一些關系:
1.輸入與輸出之間的因果關系。因果圖的表示中輸入與輸出間的因果關系有四種:
1)恆等關系:當輸入項關系,會產生對應輸出,當輸入項不發生時,不會產生對應輸出。
2)非關系:與恆等關系相反。
3)或關系:多個輸入條件中,只要有一個發生,則會產生對應輸出。
4)與關系:多個輸入條件中,只有所有輸入項發生中,才會產生對應輸出。

2.輸入與輸出之間的約束關系。因果圖的表示中輸入與輸出間的約束關系有四種:
1)異:所有輸入中至多一個輸入條件發生。
2)或:所有輸入中至少一個輸入條件發生。
3)唯一:所有輸入中有且只有一個輸入條件發生。
4)要求:所有輸入中只要有一個輸入條件發生,則其它輸入也會發生。

2、使用因果分析法得步驟
1.標識輸入和輸出
逐項分析測試子項的測試規格,找出其中的輸入和輸出並標識出來,其中要注意以下幾點:
1)輸入需要包括外部消息輸入、內部預置的用戶狀態、數據配置等所有對系統輸出有影響的因素;
2)輸入和輸出項只涉及 2 種取值的,可以只做為一個標識出來。如果輸入項涉及多種取值的,每個取值需要做為一個輸入標識出來;
3)標識符可以自己確定,但輸入與輸出需要獨立標識。
2.畫出因果圖
1)根據特性測試需求分析和 SRS 等參考文檔,針對每項測試子項的測試規格,分析輸入與輸出之間,輸入與輸入之間的關系,根據這些關系,畫出因果圖。
2)由於語法或環境限制,有些輸入與輸入之間,輸入與輸出之間的組合情況不可能出現。為表明這些特殊情況,在因果圖上用一些記號表明約束或限制條件。
3.將因果圖轉換為判定表
1)將輸入和輸出分別填入條件樁和動作樁,並在條件項填滿輸入的所有組合,若輸入有 n 項,則組合的列數應該為 2n 列。
2)根據因果圖中的輸入條件約束關系,對不可能出現的輸入組合,在動作項上做出刪除標記。
3)根據因果圖中的輸入與輸出的因果關系,在動作項上標出對應動作結果。
4.簡化判定表(可選)
同前文判定表法中簡化步驟
5.生成測試用例
簡化后的判定表的每一列可以規划為一個測試用例,它的輸入和輸出都已經非常明確。
3、案例
以中國象棋中馬的走法為例子,具體說明:
1)如果落點在棋盤外,則不移動棋子;
2)如果落點與起點不構成日字型,則不移動棋子;
3)如果落點處有自己方棋子,則不移動棋子;
4)如果在落點方向的鄰近交叉點有棋子(絆馬腿),則不移動棋子;
5)如果不屬於1-4條,且落點處無棋子,則移動棋子;
6)如果不屬於1-4條,且落點處為對方棋子 (非老將) ,則移動棋子並除去對方棋子;
7)如果不屬於1-4條,且落點處為對方老將,則移動棋子,並提示戰勝對方,游戲結束。
案例分析-因果圖分析法:
1)根據程序規格說明書描述的語義內容,分析並確定“因”和“果”;
原因:
1、落點在棋盤外;
2、不構成日字;
3、落點有自方棋子;
4、絆馬腿;
5、落點無棋子;
6、落點為對方棋子;
7、落點為對方老將。
結果:
21、不移動;
22、移動;
23、移動己方棋子消除對方棋子;
24、移動並戰勝對方。
2)將“因”和“果”表示成 “因果圖”,並標明約束條件;

3)將得到的因果圖轉換成判定表;
11這個結點稱做中間結點,是為了讓因果圖的結構更加明了,簡化因果圖導出的判定表。分析得出以下兩個結論:
只有1、2、3、4都不成立時,產生11,跟5、6、7結合分別得出22、23、24三個結果;
不管5、6、7哪個成立,只要1、2、3、4有一個成立,就產生結果21;再加上落點有自方棋子的狀況。
可以得到判定表如下:

進一步分析,將各種不可能產生的組合情況,取消掉,圖中用灰色表示。這些都是之前沒有寫的一些約束條件導致的。比如落點在棋盤外,那么落點就不可能在對方棋子上了。
4、實際應用
考慮到通過畫圖能更好的讓測試人員了解需求,看懂需求,並更快的生成判定表,因此因果圖法通常作為一種輔助的方法。當能很快得到判定表的時候,就需要畫因果圖了。只有當處理過程過於復雜,導致不太容易看清楚時才會使用因果圖法。
5、因果圖法-總結
判定表、因果圖等方法普遍使用與各種類特性的測試設計
優點:
1)充分考慮了輸入條件間的組合,對組合情況覆蓋充分。
2)最終每個用例覆蓋多種輸入情況,有利於提高測試效率。
3)設計過程中,對輸入條件間的約束關系做了考慮,避免了無效用例,用例的有效性高。
4)能同時得出每個測試項目的預期輸出。
缺點:
1)當被測試特性輸入較多時,判定表的規模將會非常龐大。
2)輸入之間的約束條件不能有效區分輸入是否確實需要進行組合測試,會造成不需要組合測試的輸入做了組合,從而產生用例冗余。
簡化:
特性輸入多時,會造成因果圖和判定表表格龐大。考慮到每個特性可以細分為若干功能流程,而這些功能流程都有自己各自的輸入,功能流程間的輸入是不需要進行組合的。
為了簡化工作量,在應用判定表、因果圖等方法前建議對特性進行盡可能的功能流程細分,然后在對每個功能流程采用上述方法。
注意,規則化簡合並存在漏測風險。一個顯然易見的原因是,雖然某個輸入條件在輸出接口上是無關的,但是在軟件設計上,內部針對這個條件走了不同的程序分支(因分析內部業務流程而定),所以在簡化時需要謹慎分析。
五、正交試驗法
1、正交實驗設計法
是從大量的試驗點中挑選出適量的、有代表性的點,應用依據伽羅瓦理論導出的 “正交表”,合理的安排試驗的一種科學的試驗設計方法,是研究多因子多狀態(或叫做多因素多水平)的一種設計方法,它是根據正交性從全面試驗中挑選出部分有代表性的點進行試驗,這些有代表性的點具備了 “均勻分散,齊整可比” 的特點,正交試驗設計是一種基於正交表的、搞效率、快速、經濟的試驗設計方法。
通常把判斷試驗結果優劣的標准叫做試驗的指標,把所有影響試驗指標的條件稱為因子,而影響試驗因子的叫做因子的轉態。
這是一種用來測試組合的方法,這一點和判定表法類似,但判定表法是通過人工對全列組合來進行化簡得到測試用例的,正交實驗法是借助於數學工具,通過算法從全排列組合中選擇出組合並放到正交表中,這樣通過查看合適的正交表就可以直接得到測試用例。
因子可以先簡單理解成輸入,一個軟件的各個輸入就可以看成因子。這樣因子的狀態就是輸入的取值了。
正交設計助手,下載解壓文件夾就能使用:鏈接進入下載
2、使用正交實驗實驗法
1.提取功能說明,構造因子-狀態表,正交設計助手中填入:

該步驟目的是要確定哪些輸入和輸入的取值需要進行組合。
2.加權篩選,生成因素分析表
計算各因子和轉態的權值,刪去一部分權值較小,即重要性較小的因子或狀態,最后生成的測試用例集縮減到允許范圍。
該步驟目的是要明確哪些輸入和輸入的取值是最需要進行組合的,這樣可以壓縮最后測試的組合數。
3.利用正交表構造測試數據集
1)如果各個因子的狀態數是不統一的,幾乎不可能出現均勻的情況。必須首先用邏輯命令來組合各因子的狀態,作出布爾圖。
2)根據布爾圖查找最接近的相應階數的正交表。
3)依照因果圖上根節點到葉子節點的順序逐步替換正交表上的中間節點,得到最終的正交表。
最關鍵的在於正交表的選取,可以按照以下原則進行選取:
如果不同因子的狀態數相同,比如有 M 個因子,每個因子 N 個狀態,則最好選取 M 因子 N 轉態的正交表,如果該正交表不存在,則逐步增加因子數,直到找到一個存在的正交表。
如果不同因子的狀態數不同,則先要確認正交表的狀態數,確認的原則是哪種狀態數在各個因子中出現的最多。
選好正交表后需要將實際的因子和狀態帶入正交表,這個時候回出現:
(1)因子的狀態數 = 正交表的狀態數 直接替換。
(2)因子的狀態數 > 正交表的狀態數 需要先將多余的狀態合並,帶入正交表,然后展開即可。
(3)因子的狀態數 < 正交表的狀態數 正交表中多出來的狀態,用實際狀態的任意值任意替換。
4.利用正交表每行數據構造測試用例
針對用實際因子和狀態替換過的正交表中的每一行選擇數據構造測試用例即可。
3、案例
1.因子:A,B,C,D
2.分析各因子狀態
A:A1,A2,A3
B:無,B2,B3
C:C1,C2,C3
D:D1,D2,D3
3.選擇正交表
確定選擇 4 因子 3 狀態的正交表。
4.將因子、狀態映射到上面的正交表中:

4、實際應用
1.單個功能測試:每個輸入都是因子,每個輸入的取值都是狀態。
2.功能組合測試:每個功能是因子,是否包含功能是狀態,也就是每個因子有 2 個狀態。
例如,手機有多個功能,針對多個功能同時使用來進行測試,(N個因子 2 個狀態)。
3.配置測試:每個配置項是因子,每個具體配置是狀態。
例如,針對 cpu 進行測試時,需要考慮 CPU 和主板、內存、顯卡、聲卡等配置項組合在一起后是否能正常工作,這樣每個配置項就是因子,而實際型號就是狀態。
5、總結
正交試驗法能借助於正交表快速的設計測試用例,在工作中有的廣泛的應用,但需要注意由於正交表是數學推導出來的,因此其中包含的組合並不考慮實際取值的意義,因此可能出現正交表中包含的組合不一定是用戶常用的,或者用戶常用的組合並未包含在正交表中。這樣就需要在使用正交試驗法的時候,注意選出來組合的實際意義,刪除無效的組合,補充漏掉的常見的組合。
優點:根據正交性從全面試驗中挑選出部分有代表性的點進行試驗,這些有代表性的點具備了 “均勻分散,整齊可比” 的特點。通過使用正交試驗法減少了測試用例,合理地減少測試的工時與費用,提高測試用例的有效性。是一種高效率、快速、經濟的實驗設計方法。
缺點:對每個狀態點同等對待,重點不突出,容易造成在用戶不常用的功能或場景中,花費不少時間進行測試設計與執行,而在重要路徑的使用上反而沒有重點測試。
雖然正交試驗設計有上述不足,但它能通過部分試驗找到最優水平組合,因而很受實際工作者的青睞。
六、狀態遷移法
將程序或流程功能拆分成各個狀態,畫出狀態遷移圖,分析各個流程。
有限狀態機是一種用來進行對象行為建模的工具,其作用主要是描述對象在它生命周期內所經歷的狀態序列,以及如何響應來自外界的各種事件。許多需求用狀態機的方式來描述,狀態機的測試主要關注在測試狀態轉移的正確性上面。對於一個有限狀態機,通過測試驗證其在給定的條件內是否能夠產生需要的狀態變化,有沒有不可達的狀態和非法的狀態,可能不可能產生非法的狀態轉移等。對於被測系統,如果我們可以抽象出它的若干個狀態、以及這些狀態之間的切換條件和切換路徑,那么我們可以從狀態遷移路徑覆蓋的角度來設計用例對該系統進行測試。狀態遷移法的目標時設計足夠的用例達到對系統狀態的覆蓋、狀態--條件組合的覆蓋以及狀態遷移路徑的覆蓋。
1、使用步驟
1.繪制狀態遷移圖
1)根據特性測試需求分析和 SRS 等參考文檔,針對每項測試子項的測試規格,分析有哪些系統狀態,這些狀態之間的遷移關系;
2)用方框代表狀態、箭頭代表狀態遷移方向(向右),繪制狀態遷移圖,在箭頭旁標識該狀態遷移的條件。如圖:

2.定義狀態--條件表
分析每個狀態下,輸入不同條件導致的輸出和狀態遷移,將其列在下表:

3.根據狀態遷移圖推導測試路徑
1)從初始狀態節點(可以有多個)出發,依據廣度優先原則遍歷狀態遷移圖,遍歷到結束狀態節點或已遍歷過的節點為一次遍歷結束,得到一條測試路徑。
2)選取需要測試的路徑,達到規定的路徑覆蓋率。這里每條路徑對應一個或幾個測試用例規格。將測試用例規格填入下表:

其中“覆蓋路徑”指該用例覆蓋的路徑的分支序列;“覆蓋的狀態--條件組合”指該分支序列上各狀態點和條件的組合(可不填)。
4.選取測試數據,構造測試用例
對選定的每條需要測試的路徑,結合等價類、邊界值分析,確定每個狀態節點的輸入,沿着該路徑通過表格將各種測試數據的輸入輸出對應起來,這樣就完成了測試用例的設計。編寫完全的用例填入下表:

案列略,上面有一個。
2、實際應用
狀態遷移圖法的核心在於通過狀態轉換樹將不同狀態之間的轉換串起來進行測試,而這里所說的轉換也可以看成是修改、改變,因此凡是設計到改變的地方都可以考慮使用狀態遷移圖法。狀態遷移圖法主要適用於以下兩種情況:
1)播放器、手機等存在工作狀態不斷改變的系統。
2)編輯功能,比如修改字體顏色,修改字體大小等等。
看后一種情況,如字體顏色有紅、藍、黃三種,測試顏色之間的轉換,狀態轉換樹如下:

用 4 個用例來進行測試即可。
3、總結
狀態遷移圖法實際上是測試了各種狀態的轉換,這些狀態轉換的測試在實際工作中是容易遺漏的。只要能將這些狀態的轉換測試到,是不是采用狀態遷移圖法並不重要,因為狀態遷移圖只不過是給出一種將多個狀態的轉換串起來進行測試的思路。
七、流程分析法
主要針對場景類型屬於流程測試場景的測試項下的測試子項進行設計,這是從白盒測試中路徑覆蓋分析法借鑒過來的一種很重要的方法。白盒測試中,路徑就是指函數代碼的某個分支組合,路徑覆蓋法需要我們構造足夠的用例覆蓋函數的所有代碼路徑。在黑盒測試中,如果我們將軟件系統的某個流程也看成路徑的話,我們將可以嘗試着用路徑分析的方法來設計測試用例。
采用路徑分析的方法設計測試用例有兩點好處:
1)降低了測試用例設計難度,只要搞清了各種流程,就可以設計出高質量的測試用例來,而不用太多測試方面的經驗;
2)在測試時間較緊的情況下,可以有的放矢的選擇測試用例,而不用完全根據經驗來取舍。
1、實施步驟
1.畫出業務流程圖
針對測試場景類型屬於流程測試場景的測試項下的測試子項,先從其最基本的流程入手,將流程抽象成為不同單功能點的順序執行。在最基本流程的基礎上再去考慮次要或者異常的流程,這樣將各種流程逐漸細化,最后完成完整的針對該測試子項的流程圖。流程圖可以逐漸加深對流程的理解,還可以將各個看似孤立的流程關聯起來。
畫流程圖時需要注意:
1)圓圈描述系統狀態,箭頭描述該狀態下的輸入或外部因素(條件)引起的狀態遷移;
2)需要描述正常流程和異常流程;
3)若功能流程中涉及到多個實體的,可以畫到一個流程圖中,在圓圈或箭頭的描述部分對屬於哪個實體進行說明;
4)對於與被測試子項無關的分支不需要考慮。
2.定義狀態節點和條件分支
順着功能流程,針對被測試特性的每一狀態節點分析其輸入(條件)、下一狀態節點、輸出,並填寫下表:

1)分析過程是針對功能流程中的各個狀態分別分析的;
2)輸入需要考慮與被測試對象的各個接口,輸入可能是外部用戶輸入、系統內部定時觸發、周邊系統輸入等;
3)輸入的分析需要詳細到參數級別;
4)對系統處理的分析過程中,需要全面考慮處理過程用到哪些資源,查過哪些表格,對用戶狀態做過哪些判斷等。這些關鍵點如果是外部可控的,都可列入到輸入中去;
5)輸出是觀察點的重要依據,表示系統沿流程分支處理業務時的輸出,包括消息輸出、后台輸出、本地數據記錄等;
6)對於系統不處理的輸入,或沒有必要測試的輸入,在表中標出。
注:在分析過程中,會發現存在狀態是在其它功能流程中已經分析過的,那么不需要重復分析。
分支優先級根據兩個原則來選取:一是分支使用的頻率,使用越頻繁的優先級越高;二是分支的重要程度,如果失敗對系統影響越大的優先級越高。將根據兩個原則所得到的路徑各分支的優先級相加就得到了整個路徑的優先級。
3.確定測試路徑
步驟2 確定了每個分支的優先級后,將組成路徑的各分支的優先級相加就得到了路徑的優先級。給每條路徑設定優先級,這樣在測試時就可以先測試優先級高的,再測試優先級低的,在時間緊迫的情況下甚至可以考慮忽略一些低優先的路徑。根據優先級的排序就可以更有針對性的進行測試。
根據每條路徑的優先級和測試進度情況,選取需要測試的路徑,達到規定的路徑覆蓋率。這里每條路徑對應一個或幾個測試用例規格。將測試用例規格填入下表:

其中“覆蓋路徑”指該用例覆蓋的路徑的分支序列;“覆蓋的樣點”指該分支序列上某個或某幾個狀態點的輸入的等價類點或邊界點(可不填)
通常對於有向圖,采用基本路徑覆蓋法,對於每條基本路徑規划一個用例對其進行覆蓋。這里有幾個概念:
環路復雜度:有向圖的閉合區域數 +1;
基本路徑:至少包含有一條在其它基本路徑中從未有過的邊的路徑;
基本路徑數 = 環路復雜度
這里計算環路復雜度(圈數)時,入口點要求入度(進入分支數)為 0 ,出度(出發分支數)為 1 ;出口點要求出度為 0,入度為 1 。如果入口點不符合入度、出度要求(下圖),可以在入口點之上增加一個節點作為純入口節點;出口點也可以進行類似處理。經過上述處理后,入口點、出口點不會既可能出現在路徑首末端,又可能出現在路徑中間。


進行了如上述處理后,再分析該有向圖的基本路徑。按基本路徑的定義----至少包含有一條在其它基本路徑中從未有過的邊的路徑,這個定義很容易產生歧義。這里參考線性空間的概念來理解,基本路徑相當於所有路徑空間(當有循環、為有向有環圖時,路徑數可能為無窮)的一組基,即路徑空間的其他任意路徑都可以由這些基本路徑組合而成(這里的組合需要理解成向量基的四則運算,只能沿路徑的正向和逆向進行運算)。如果一個路徑可以由已有基本路徑組合而成,則這個路徑不是一條基本路徑。
例如在某個有向圖中,有兩個循環,其路徑為:
路徑1:1-2-4-6-7;
路徑2:1-2-3-2-4-6-7;
路徑3:1-2-4-6-5-6-7;
有路徑4:1-2-3-2-4-6-5-6-7,路徑4 不為基路徑。因為:路徑4 - 路徑2 =5-6,路徑3 -路徑1 = 5-6,所以 路徑4 = 路徑2 + 路徑3 -路徑1
4.選取測試數據,構造測試用例
對選定的每條需要測試的路徑,結合等價類、邊界值分析,確定每個狀態節點的輸入,沿着該路徑通過表格將各種測試數據的輸入輸出對應起來,這樣就完成了測試用例的設計。
2、實際應用
流程分析法主要用於有先后順序的測試,主要針對:
1)業務流程的測試
2)安裝流程的測試
3、總結
流程分析法的重點在測試流程,因此每個流程用一個測試用例驗證即可,流程測試沒有問題並不能說明系統功能就沒問題了,還需要針對單步的功能來進行測試,只有這兩者都測試到了,才能算是比較充分的測試。
八、輸入域測試法
1、概念
輸入域測試法是一種綜合的方法,綜合了前面提到的等價類划分法、邊界值分析法等方法。這里提到的輸入域就是指輸入,針對輸入會有各種各樣的輸入值。輸入域測試主要考慮三個方面:
1.極端測試,需要選擇測試數據覆蓋輸入域的極端情況
2.中間范圍測試,選擇內部的數據進行測試
3.特殊值測試,根據要計算的功能特性的基礎來選擇測試數據。這個過程尤其適合於數學計算。所要計算功能的屬性可以有助於選擇能夠驗證被計算方案正確的測試數據。例如,根據Sin()函數的周期,可以使用 2π 不同的倍數的測試數據。
對於結構化的輸入域,要選擇每個成員的輸入點的組合。這個過程可能會產生大量的數據。如果考慮輸入域之間內部聯系有選擇的進行組合,可以一定程度上減輕這個問題。
2、使用方法
輸入域測試法實際上是在等價類划分法、邊界值分析法的基礎上考慮了特殊值測試等其它情況,因此從步驟來講,只需要在使用完等價類划分、邊界值分析的基礎上再考慮:
1.特殊值:主要和輸入的特點有關,需要了解系統對該輸入的存儲和處理。
2.長時間輸入:對於那些沒有限制輸入長度的輸入進行長時間的持續輸入,以查看是否存在輸入的數據內存越界導致系統故障的情況。
3、案例
由於等價類、邊界值在前面已經提到過,因此這里重點舉例說明特殊值的情況。特殊值比如年份的2038年,目前大量的軟件中存在一個和2038年相關的bug,2038bug產生的原因是:
Time_t 是C/C++等編程語言在內部代表/存儲日期和時間的一種數據類型。Time_t實際上是一個代表秒數的整數,當它的值為0 時,代表的時間是 1970年1月1日12:00:00;當Time_t=60時,則表示1970年1月1日12:01:00,依次類推。
所有 32位電腦系統都用帶符號 32位整型來存儲time_t的值,也就是說t_time只能用31位二進制數來表示(第一位用來表示正負號),而其最大值轉換為十進制是2147483647,換算成日期和時間剛好是2038年1月19日03:14:07am(GMT),而這一秒過后,t_time的值將變成-2147483647,代表的是1901年12月13日8:45:52pm,這樣32位軟硬件系統的日期時間顯示就都亂套了。另外,無法接受time_t為負值的其他功能也將返回錯誤。
舉個例子來說,登陸上Yahoo messenger,給好友發送個消息沒問題,現在把系統時間更改為2038年1月19日03:14:07am,此時如果再發消息Yahoo messenger就將崩潰。
九、輸出域分析法
1、概念
在前面域測試(含等價類、邊界值分析)中,是針對系統的輸入域進行分析,設計用例覆蓋輸入域的等價類和邊界值。但由於系統輸出和輸入之間一般並不是線性關系,所以從輸出域的角度來看,這些覆蓋了輸入域所有等價類和邊界值的用例,並不一定能完全覆蓋輸出的等價類和邊界值。因此,我們有必要對輸出域進行等價類和邊界值分析,確定要覆蓋的輸出域樣點,然后反推得到應該輸入的輸入值,從而構造出測試用例。這種測試方法就是輸出域分析法,它的目的是為了達到輸出域的等價類和邊界值覆蓋。
2、分析步驟
1.針對輸出域划分等價類(可選),在划分過程中,划分結果可以填寫到下表:

2.分析樣點
針對每個等價類區域分析其上點、離點、內點,結果填寫到下表:

3.確定覆蓋的輸出點,然后反推得到應該輸入的輸入值,從而構造出測試用例
從划分出的等價類中按以下三個原則設計測試用例:
1)為每一個等價類內點、上點或離點規定一個唯一的編號。
2)設計一個新的測試用例,使其輸出盡可能多地覆蓋尚未被覆蓋地有效等價類的內點、上點或離點,重復這一步,直到所有的輸出的有效等價類點都被覆蓋為止。
3)設計一個新的測試用例,使其輸出僅覆蓋一個尚未被覆蓋的無效等價類的內點、上點或離點,重復這一步,直到所有的輸出的無效等價類的內點、上點或離點都覆蓋為止。
設計的測試用例填寫到下表:

3、案例
一軟件統計代碼的工具,要選擇統計(.c)文件,選擇要統計的項目(可以是代碼行、注釋行、空行、總行),點擊開始統計即可。
輸出的代碼行數滿足:
1)檢查到參數【源文件全路徑】中的文件后綴名不是 .c :彈出對話框,提示用戶“文件【源文件全路徑】不是 *.c,文件類型非法,請重新選擇文件”。
2)檢查到參數【源文件全路徑】中所指向的文件不存在或者被其它應用程序采用獨占的方式打開,提示用戶“無法打開該文件,請重新選擇文件!”。
3)檢查到參數【源文件名】中的文件大於1M :彈出對話框,提示用戶“文件【源文件全路徑】超過1M ,無法統計,請選擇其它文件”。
4)統計 .c 文件中的代碼行數后:輸出如下結果信息:“統計代碼行數(非空非注釋行)共XXXX行”。
如果采用輸出域分析法,則首先測試用例要包含這 4 種情況,另外對於第 4 種情況而言,代碼行數有其取值范圍[0,最大值],這樣還需要對 0 和最大值這兩個邊界值進行覆蓋。
十、異常分析法
1、概念
異常分析法就是針對系統有可能存在的異常操作、軟硬件缺陷引起的故障進行分析,依次設計測試用例。主要針對系統的容錯能力、故障恢復能力進行測試。簡單一點說就是人為讓系統出現故障,然后檢查系統的故障恢復能力。
2、分析步驟
1.針對系統羅列可能的故障
這些故障包含軟件和硬件方面的故障,常見的故障有:
(1)斷電
(2)斷網
(3)硬件損壞
(4)數據損壞
(5)內存不夠
(6)等等
為了更好的羅列故障,需要多查看用戶反饋的故障報告,多深入了解被測的系統。
2.針對每種可能故障設計測試用
設計測試用例時主要要考慮如何更有效更經濟的制造各種故障。
3、案例
針對某在線音樂播放器進行測試,需要考慮斷網的異常。從測試用例的角度來說,就是先用該播放器播放歌曲,然后拔掉網線,人為制造斷網的故障,過一段時間后再接上網線,恢復網絡,這時候來看一下播放器是否能正常工作。
十一、錯誤猜測法
1、概念
在軟件測試中,人們可以靠經驗和直覺推測系統中可能存在的各種錯誤,從而有針對性地編寫檢查這些錯誤的例子,這就叫錯誤推測法。其基本想法是:根據以往的測試經驗和對系統內部知識的了解,列出系統中各種可能有的錯誤和容易發生錯誤的特殊情況,在根據它們來設計測試用例。隨着在產品測試的實踐中對產品的了解的加深和測試經驗的豐富,使用錯誤推理法設計的測試用例往往非常有效,可以作為測試設計的一種補充手段。並且積累的經驗越豐富,方法使用效率越高。
錯誤猜測法不是瞎猜,它需要依據對系統薄弱地方的了解和對開發人員盲點的了解。錯誤猜測需要了解錯誤,因此需要了解缺陷分類,了解了缺陷分類更加有利於定性地從大方面體系地把握錯誤、提高錯誤推測的全面性以及城市用例的命中率(有效性)。關於缺陷的分類,如果公司已經開展了ODC正交缺陷分析的話,可以參考公司有關缺陷分類文檔,如果沒有,最好進行明確定義。缺陷分類活動和錯誤猜測法的區別是,缺陷分類活動對缺陷進行定性分類找出改進點,主要關注缺陷預防;錯誤猜測關注於設計測試用例去發現問題。
錯誤猜測法有時是非常有效的,但要注意錯誤猜想法只能作為測試設計的補充而不能單獨用來設計測試用例,否則可能會造成測試的不充分。也就是說,錯誤猜測法只是針對系統可能存在的薄弱環節的測試補充,而不是為了覆蓋而測試。
2、使用步驟
1.確定合適的錯誤猜測 CHECKLIST
在進行錯誤推測前需要根據軟件的具體特點制訂錯誤猜測 CHECKLIST,使之適合在本軟件當前版本的測試用例設計中有效的使用。該 CHECKLIST 可以根據缺陷分類文檔來合理設計,保證 CHECKLIST 的完整性。下面是錯誤猜測 CHECKLIST 的樣例:

2.確定需要進行錯誤猜測的測試子項
錯誤猜測方法並不是任何時候和每個地方都需要使用的。如果是簡單的功能驗證,影響因素已經非常清楚和簡單的情況下沒有必要進行各種錯誤猜測。對於影響因素比較復雜的、系統性的測試規格,可能需要作為常規特性測試設計的補充,使用錯誤猜測方法進行特性測試設計。在特性測試需求分析活動時就應該確定哪些測試子項需要運用錯誤猜測法進行測試設計。
3.根據 CHECKLIST 檢查對應測試子項的規格進行錯誤猜測
確定了需要進行錯誤猜測的測試子項,與錯誤推測 CHECKLIST 以后,就需要對每個測試子項的規格按照 CHECKLIST 逐一分析比對,如果發現有對應的“易錯誤點”,(在 CHECKLIST 中)標記“有”,並將具體的內容寫入“測試用例”表,直到全部需要進行錯誤猜測的測試子項對比分析完畢。
設計的測試用例填寫到下表:

3、案例
寫一段程序重新格式化文本,具體如下:
給定一個文本,以 CHECKLIST 字符結尾,並且文本內的字之間使用 BLANK 或者 NEWLINE 字符隔開,根據下面規則把該文本轉成一行接一行的格式:
(1)行在文本有 BLANK 或 NEWLINE 處中斷;
(2)行盡可能長;
(3)沒有行可以有超過 MAXPOS 長度的字符。
這段規格會使一個有經驗的程序員懷疑程序能否在下面這些情況下正確工作(因此可以從這些情況中選擇測試用例):
(1)輸入文本長度是零
(2)文本包含一個非常長的字(超過 MAXPOS)
(3)文本除了 BLANK 和 NEWLINE 之外沒有任何別的字符
(4)一個文本有一個空行
(5)字被兩個或更多個 NEWLINE 或 BLANK 分隔
(6)BLANK 為行的開頭或結束字符
(7)文本包含數字或特殊字符
(8)文本包含不可打印字符
(9)MAXPOS 被設置為一個超過系統默認行長度的數字
十二、總結
下面通過一個表格將主要的黑盒測試用例設計方法進行歸納總結:

學習筆記
2020-04-12
