1、邊界值測試的難點
關於邊界值測試核心內容(或者說是難點),筆者以為,我們主要需要注意以下4點:
1)如何選擇輸入域或輸出域,以便順利推進后續的邊界值測試用例設計;
2)如何確定輸入域或輸出域的邊界,以便確保所有測試對象的邊界值都被覆蓋到;
3)如何確定輸入域或輸出域邊界附近的鄰域范圍,以便我們及時發現邊界潛在的問題;
4)如何根據被測對象的邊界及其鄰域,去設計更為合理和嚴謹的測試用例。
2、如何確定輸入域?
一般情況下,原始輸入域通常是由多個輸入條件共同構成的,並具有一定實際意義。我們也稱之為整體輸入域。整體輸入域的邊界通常很清晰,我們很容易去展開測試。這時,你可能想問:既然如此,確定輸入域不是非常簡單嗎?
還真並非如此。輸入域之所以不好確定,是邊界點太少,難以覆蓋所有隱含邊界情況造成的。尤其是當各個輸入條件之間,存在較為復雜的約束關系時,此時的輸入域將更難確定。
因此,在確定輸入域時,我們可將整體輸入域拆分成由各個輸入條件,分別構成的單個輸入域,從而找出這些輸入域的集合(以下稱,個體輸入域)。
3、如何確定邊界值?
通過上述描述,我們基本能找出所有個體輸入域來。那么,我們如何通過這些個體輸入域,從而確定他們的邊界呢?下面我們一起來看看。
對於某個輸入條件而言,確定邊界可參照如下原則:
1)若輸入條件規定了取值范圍,則以該范圍作為邊界;2)若輸入條件規定了值的個數,則以值的個數為邊界;3)若輸入域是有序集合(如有序表、順序文件等),則選取集合中特定次序的數據作為邊界,如第一個或最后一個數據等。
在實際工作中,當我們針對某個輸入條件,去確定邊界點時,我們可以這樣去思考:
1)首先,我們可以在需求描述中,尋找最大極限邊界。比如:最低XX,最高XX;最多XX,最少XX;等等。像這類凡是可用數值來描述的,無論在SRS中是否明確指出其邊界,其極限邊界條件已經是固定的了。
所以,你可以根據其變量的特點,找到對應的取值范圍。比如,C++中int型變量的取值范圍是:−32768~32767,當SRS中未明確規定輸入條件的邊界時,該取值范圍就是其極限邊界。
2)其次,我們還可以在需求描述中,尋找其他較為明顯的邊界。這些邊界點的特征比較明確,主要是:當在該點附近一個極小的鄰域內分別取小於、等於和大於該點的3個值時,被測對象對這些值的處理方式不完全相同,則該點就是導致被測對象的輸出發生本質變化的邊界點。
簡單點說,就是在輸入某個條件的邊界時,不僅包含最小值點和最大值點,還可能存在其他非極值性質的邊界點。這個問題,我們要留意一下。
3)另外,我們還需要關注軟件內部的邊界點,或者說是次邊界條件或內部邊界條件。比如,2的乘方、ASCII字符表等。值得注意的是,測試新手(或者終端的客戶)是很難發現這些邊界問題的。但如果因為我們是新手,找不到問題就認為沒有問題,這就是“埋下隱患”的開始。當然,這也激勵着我們努力學習專業知識,努力成長為專業測測試達人。
總之,邊界點的確認,既可以針對整體輸入域進行,也可通過個體輸入域來尋找。兩種方法是都可行的。但這些都需要遵循一個原則——獨立性假設原則。即當針對某個輸入條件確定邊界點時,不考慮其他輸入條件可能對該輸入條件所產生的任何影響。這樣,我們的邊界值將覆蓋的更為全面。
4、如何設置邊界點附近的鄰域?
我們都知道,一般情況下,邊界點及其附近,都可能存在bug。因此,在測試時,我們需要在邊界點附近確定大小為1的領域,並應基於所有邊界點及其鄰域來設計測試用例。(注:這里的“1”是指1個單位長度,並非數字意義上的“1”。鄰域應根據測試分析的結果,靈活設置。)
5、如何設計測試用例?
通過上述4條,相信大家都知道如何去尋找測試對象的邊界值了。當我們找出所有的邊界點集合及其鄰域后,我們只需要在這些邊界和鄰域中,選擇適當規模的數據進行測試即可。
那么,我們應該如何選擇測試數據、如何選擇邊界組合方式,來保證測試用例的質量呢?下面,我們來給大家介紹一下。
1)測試數據的選擇
主要包括兩種方法。一個是窮舉法,一個是典型值法。相信大家根據名字也不難理解其中的意思。這里就不贅述了,想了解的小伙伴可自行詢問度娘。
2)邊界組合方式的選擇
主要包括3種方式:強邊界法、弱邊界法和全邊界法。其中,
-
強邊界法要求每個測試用例都對應多個輸入條件,同時取邊界測試數據;
-
弱邊界法則是基於單缺陷假設提出來的,即被測對象只要在某個輸入條件的某個邊界出錯,則在任何包含該輸入條件的某個邊界的情況下一定會出錯,那么測試時僅覆蓋輸入條件的單個邊界點即可,無需測試多個輸入條件同時取邊界測試數據的情況;
-
全邊界法是將所有邊界組合情況全部納入測試內容,即強邊界+弱邊界。優勢在於可測試到所有邊界,但由此可能會導致的巨大測試量。