王雪松 楊菲
摘要:作為有效的測試執(zhí)行,需要有策略、有目的地完成用戶可能完成的操作。既不被用例約束,也不因自己的喜惡而變得隨意。在發(fā)現(xiàn)故障后,我們還需要?dú)w納出故障的復(fù)現(xiàn)方法,以保證反饋給開發(fā)的是一個最佳的復(fù)現(xiàn)路徑。
關(guān)鍵詞:測試;歸納;故障;操作
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)31-0251-03
1 問題的提出
用例執(zhí)行,其主要目是對功能進(jìn)行一個覆蓋測試,而不是著重于某一細(xì)節(jié),因此故障暴露程度受到一定限制。
自由測試,雖然強(qiáng)調(diào)故障暴露程度,但是由于操作過程較為隨意,存在測試覆蓋不全面的隱患。
我們需要如何把握好兩種測試方法,并在此基礎(chǔ)上完成有效測試呢?
2 解決思路
結(jié)合用例,而不限制于用例;自由執(zhí)行,而不隨意執(zhí)行。
我們以此開展測試,當(dāng)掌握好測試原理并對用例熟知后,就可以同時做好兩件事。
本文介紹了個人的測試執(zhí)行心得,并對尋找故障復(fù)現(xiàn)路徑的方法進(jìn)行一些介紹,為后續(xù)測試執(zhí)行人員提供參考。
3 實踐情況
3.1 執(zhí)行用例
如果是測試新人,那么很可能是從用例執(zhí)行開始學(xué)習(xí)測試的。
用例執(zhí)行是一種能很快熟悉測試業(yè)務(wù)的方式,我們可以從用例執(zhí)行開始一步一步成長起來:
(1) 養(yǎng)成循序漸進(jìn)的測試習(xí)慣
執(zhí)行用例過程中,除了熟悉手機(jī)的各個功能,還可以對用例設(shè)計思路有所了解。
高質(zhì)量的用例其測試目的明確,測試步驟有序,通常從主要且常用的操作延伸至次要、不常用的操作。
這樣的思路可以幫助我們養(yǎng)成良好的測試習(xí)慣——先測基本功能,后關(guān)注細(xì)節(jié)。
無論哪一種類型的測試,最主要的、最常用的功能總是應(yīng)該放在首位測試。
因此,即便是基本的用例執(zhí)行工作,我們也可以養(yǎng)成一種循序漸進(jìn)的測試習(xí)慣,這對日后把握好測試節(jié)奏很有幫助。
(2) 從“使用”向“測試”過渡
作為新人,之前對測試的認(rèn)知可能還停留在“使用”階段。
使用和測試不同,使用一般只會涉及最常用的操作和數(shù)據(jù)。
而測試,強(qiáng)調(diào)目的性和策略性。
有經(jīng)驗的測試人員總是更容易發(fā)現(xiàn)軟件缺陷,并且找到復(fù)現(xiàn)路徑。
因此,在用例執(zhí)行階段,我們可以跟著用例逐步從“使用”向“測試”過渡。
(3) 熟悉用例取值,掌握測試基本要領(lǐng)
我們可以通過執(zhí)行高質(zhì)量的用例,根據(jù)用例設(shè)計者的思路來掌握一些基本的“策略”和“目的”。
這些“策略”和“目的”可以來自于用例設(shè)計者的取值方法,比如來自于等價類法和邊界值法。
試想一下,為什么同樣編輯一條短消息,有的人會發(fā)現(xiàn)問題,有的人沒有發(fā)現(xiàn)問題呢?
取值不同,輸入的數(shù)據(jù)不同,得到的結(jié)果完全不一樣。
這些最有代表性的取值,用例中都能體現(xiàn)。
所以,在新入職的時候,執(zhí)行一下用例,是快速成長起來的好方法。
3.2 拋開用例
不少測試書籍中提到:測試需要排除隨意性。
隨意的測試,主要是擔(dān)心無法覆蓋基本功能,因受到測試人員的經(jīng)驗不足、性格因素等影響而遺漏某些操作。
但是,我們在測試中也往往發(fā)現(xiàn),自由測試發(fā)現(xiàn)的故障會更多。
有沒有方法可以既不隨意也能自由發(fā)揮呢?
(1) 循序漸進(jìn),把握測試節(jié)奏
其實,在我們熟悉了某個模塊后,在對整個測試用例熟悉后、在擁有完整的測試思路后,自由而不隨意的測試是可以實現(xiàn)的。
比如,在某個XXX項目中,需要針對通話模塊進(jìn)行測試,用例通常會包含這樣幾方面:
① 語音電話
② 附加業(yè)務(wù)
③ 電話菜單
在每一個功能點(diǎn)下,用例再逐步展開,如語音通話又包括主叫和被叫,附加業(yè)務(wù)又需要考慮呼叫轉(zhuǎn)移、呼叫限制等等。
高質(zhì)量的用例會循序漸進(jìn),先對主要功能進(jìn)行驗證,后查看細(xì)節(jié)或者并發(fā)操作。
那么自由測試也可以按此思路執(zhí)行:先測基本功能和常用操作,再逐步擴(kuò)展用例加入并發(fā)測試,層層深入。
借此,我們可以很好地把握自由測試的節(jié)奏,而不是漫無目的地執(zhí)行某一個細(xì)節(jié)操作,最終覆蓋不到全局。
(2) 組合用例,減少操作步驟
自由測試可以自行發(fā)揮,將多條用例銜接操作。
比如,這里有五條通話模塊的用例:
用例一:測試機(jī)在待機(jī)輸入固話號碼并呼出,對方接聽。
用例二:測試機(jī)呼叫固話,對方接聽,測試機(jī)按end鍵掛斷通話。
用例三:測試機(jī)呼叫固話,對方接聽,進(jìn)入message模塊,發(fā)送短信。
用例四:測試機(jī)呼叫固話,對方接聽,通話過程中有鬧鐘到時。
用例五:測試機(jī)呼叫固話,對方接聽,通話過程中有收到短信,進(jìn)入查看。
作為測試新人,需要按部就班執(zhí)行五條用例。
但是作為熟悉該模塊和用例的人員來說(比如我們的流水線模塊測試專家),可以通過一次操作執(zhí)行五條用例,而所做的只是改變一下順序:
用例一:
步驟1:設(shè)置一個2分鐘后的鬧鐘。
步驟2:測試機(jī)回到待機(jī),呼叫固話,固話接聽。
步驟3:進(jìn)入message模塊,發(fā)送短信給自己。
步驟4:收到自己發(fā)送的短信,進(jìn)入查看。
步驟5:之前設(shè)置的鬧鐘到時。
步驟6:固話側(cè)掛斷通話。
這樣操作,不僅壓縮了用例,而且串行的操作比單一的操作更容易發(fā)現(xiàn)問題。
(當(dāng)然,這些只是作為我們執(zhí)行人員的自由操作步驟。作為指導(dǎo)測試的用例來說可能并不適合按此編寫,無法體現(xiàn)其循序漸進(jìn)的測試思路,也可能因其耦合度過高在早期版本無法執(zhí)行等。)
(3) 以自由測試完成用例執(zhí)行
如果能做到以上兩點(diǎn),此時就可以拋開用例,以自己最習(xí)慣、且效率最高的方式去自由執(zhí)行。
在整個執(zhí)行過程中,我們有目的、有策略。我們的自由操作融入了每一條測試用例,要達(dá)到自由而不隨意的測試目的就變得簡單了。
最后,只需要根據(jù)實際測試結(jié)果反饋用例執(zhí)行情況,整個用例執(zhí)行過程變得高效。
3.3 超越用例
功能覆蓋和故障發(fā)現(xiàn)是不同的兩個概念。
因此,要發(fā)現(xiàn)更多故障,肯定要超出用例的范圍。
(1) 關(guān)注用例遺漏的取值
不可否認(rèn),再完善的用例也總會存在遺漏,一些細(xì)節(jié)和不常用的操作可能沒有寫為用例。
比如,在輸入法測試中,用例對字符個數(shù)的測試著重點(diǎn)可能是:
0 字符
滿額字符
1/2滿額字符
(這里單指輸入法模塊,不涉及短消息等其他模塊)
如果按此分類,有沒有遺漏其他重要的值?
至少有以下幾個重要值被遺漏:
① 單行
② 滿行
③ 滿屏
這三個重要的取值如果用例沒有涉及的話,就需要引起我們重視了。
單行,涉及滿一行后光標(biāo)的跳轉(zhuǎn),增加一個字就換行,減少一個字就還原到一行。此時光標(biāo)在行前行后的切換也是關(guān)注點(diǎn)。
滿行,滿行和滿額不同,滿行需要考驗最大行數(shù)的處理。并不是滿足了滿額的條件就同時能滿足滿行的條件,因為我們可以直接輸入一個回車符產(chǎn)生一行。那么,原本只能輸入100個字符(3~4行)的界面就需要接受100行的考驗。作為用戶不易操作的功能,這里可作為一個擴(kuò)展。
滿屏,比起滿行的操作來,這是一個用戶很容易遇到的問題。滿屏的問題就在于滾動條的切換。多一個字會產(chǎn)生滾動條,少一個會消失,這里的關(guān)注點(diǎn)可能在于滾動條的切換情況等等。
(2) 模擬測試環(huán)境
為什么外場測試總是能發(fā)現(xiàn)很多家里無法發(fā)現(xiàn)的問題呢?
網(wǎng)絡(luò)的復(fù)雜是一個重要的原因。
在外場某處特殊的網(wǎng)絡(luò)環(huán)境下,經(jīng)常會看到無法連接網(wǎng)絡(luò)、無法打電話、無法發(fā)消息等故障反饋。
在家里,可能無法模擬那么多特殊的網(wǎng)絡(luò)環(huán)境。但是可以嘗試多種狀態(tài)的切換對手機(jī)的考驗,如有網(wǎng)、無網(wǎng)、找網(wǎng)、錯誤網(wǎng)絡(luò)這樣的情況我們在辦公室內(nèi)就可以模擬。
最容易出現(xiàn)故障的網(wǎng)絡(luò)狀態(tài)可能是不停切換的網(wǎng)絡(luò)狀態(tài),從有網(wǎng)——無網(wǎng)——有網(wǎng),如此不停地循環(huán)切換。
測試中可以累積一些小技巧來創(chuàng)造這樣的網(wǎng)絡(luò)環(huán)境,比如通話中將手機(jī)放進(jìn)一個金屬茶葉罐,這樣就模擬了有網(wǎng)——掉網(wǎng)——無網(wǎng)的情況。再將手機(jī)從茶葉罐中取出,則又模擬了無網(wǎng)——重新找網(wǎng)——有網(wǎng)。
通過類似的小技巧,我們可以模擬一些簡單的網(wǎng)絡(luò)弱信號和切換,以此在辦公室里就進(jìn)行一次“小型場測”。
另外,我們還可以擴(kuò)展網(wǎng)絡(luò)狀態(tài)切換的概念、嘗試結(jié)合邊界值法并入并發(fā)測試,在網(wǎng)絡(luò)切換的一瞬間執(zhí)行某一操作,比如:來電后進(jìn)入無信號區(qū)域,掉網(wǎng)的同時按接聽或者掛斷等等。類似操作,往往都是小概率故障復(fù)現(xiàn)的關(guān)鍵。
(3) 注重用戶習(xí)慣
注重用戶的習(xí)慣,經(jīng)常把自己當(dāng)成一個用戶,以用戶的習(xí)慣去使用手機(jī)。
有的用戶喜歡沒事滑蓋、盒蓋,這是一種用戶習(xí)慣。
有的用戶喜歡經(jīng)常在觸摸屏上來回劃線,這也是一種用戶習(xí)慣。
用戶的習(xí)慣千奇百怪,這里我們能代表的用戶可能只是我們自己,那就以我們自己的習(xí)慣去使用手機(jī),而不僅僅作為一個測試人員。
按此設(shè)想,我們的測試思路是否又有所拓寬呢?
可以借此把用戶可能遇到而用例設(shè)計者難以想到的問題挖掘出來。
(4) 反其道而行
這種方法和剛才說的以用戶習(xí)慣測試的方式是完全相反的。
以用戶使用習(xí)慣出發(fā)的測試,就是把自己當(dāng)做用戶,所思所想均為用戶可能的操作。
而完全相反的操作方法就是努力尋求自己或者一般用戶不易執(zhí)行、而開發(fā)人員也容易忽略的操作。
舉一個例子,在E520項目的測試中,曾經(jīng)發(fā)現(xiàn)這樣一個故障:
步驟1:用立體聲藍(lán)牙耳機(jī)播放音樂。
步驟2:音樂播放界面鬧鐘到時。
步驟3:鬧鐘到時界面直接按藍(lán)牙耳機(jī)的上一曲/下一曲功能。
操作結(jié)果:測試機(jī)MMI被異常調(diào)起,測試機(jī)死機(jī)。
作為用戶的使用習(xí)慣,在鬧鐘到時后常見的操作是:關(guān)閉鬧鐘,按下延時開關(guān),或者不執(zhí)行任何操作。
開發(fā)人員除了考慮正常操作外也會加入一些并發(fā)事件的考慮:比如來電、來鬧鐘、低電等等。
那么有什么是用戶不易使用而開發(fā)人員也容易忽略的呢?
這里,可以把自己想象成一個笨拙的、怪異的用戶,去操作一些不能以常理推斷的操作。
在這個故障中,普通用戶既然已經(jīng)知曉音樂播放器被掛起,也就不會去繼續(xù)操作此時毫無意義可言的藍(lán)牙耳機(jī)了。而另一方面,開發(fā)也難以想象音樂播放器被掛起后,還有人會去操作藍(lán)牙耳機(jī)。
我們就把自己想象成這樣一個怪異的用戶,別人越不喜歡的操作我們越去操作,最終得以發(fā)現(xiàn)這個故障。
類似反其道而行的測試思路,通常會放在主要功能測試之后,作為對用例遺漏點(diǎn)的一個覆蓋。
(5) 關(guān)注測試疲勞
測試疲勞一般產(chǎn)生在長時間測試同一功能后,現(xiàn)象是興趣下降、故障暴露能力降低等等。
再優(yōu)秀的測試人員都無法完全避免測試疲勞。
所以,在測試中,我們需要關(guān)注當(dāng)前階段是否已經(jīng)存在疲勞測試的問題。疲勞測試的結(jié)果是投入大量時間和人力,卻只收獲到很小的成果。
這里,通常采用的方法就是交換測試模塊。交換測試模塊后,我們會著手一個全新模塊的測試,測試興趣會有所提高。而其他測試人員接手自己原來的模塊,這可以引入新視角,從而發(fā)現(xiàn)很多原來自己沒有發(fā)現(xiàn)的問題。
當(dāng)然,交換模塊也會存在一些問題:比如交換模塊后測試人員需要重新熟悉新模塊,這需要一定的時間,另外也可能存在故障重復(fù)提交等問題。
作為測試執(zhí)行人員,除了配合主測的策略外,此時也需要告知自己的困難,大家攜手把測試疲勞期過渡好。
3.4 擅于總結(jié)故障復(fù)現(xiàn)路徑
從故障的發(fā)現(xiàn)到復(fù)現(xiàn)可能并不是一帆風(fēng)順的,因為很多故障很難一次找到復(fù)現(xiàn)路徑。關(guān)于這一類非復(fù)現(xiàn)故障,我們往往需要重復(fù)測試。
下面介紹一下總結(jié)故障復(fù)現(xiàn)路徑的幾個常用方法:
(1) 復(fù)現(xiàn)路徑的回溯
最簡單的做法就是重復(fù)前一次操作,即發(fā)現(xiàn)故障時執(zhí)行過什么操作,如法炮制重復(fù)一遍。
這個操作可發(fā)現(xiàn)大部分步驟較少、且較易復(fù)現(xiàn)的故障路徑。
而對于操作過于復(fù)雜、重復(fù)執(zhí)行后還是無法復(fù)現(xiàn)的問題,我們就會懷疑自己是否遺漏了某一個重要的操作步驟。
那么此時,我們需要做的就是——擴(kuò)展復(fù)現(xiàn)路徑。
(2) 擴(kuò)展復(fù)現(xiàn)路徑
擴(kuò)展復(fù)現(xiàn)路徑,主要是在第一次發(fā)現(xiàn)故障的基礎(chǔ)上,考慮之前可能操作過的步驟。
這里,我們可以結(jié)合以往的測試經(jīng)驗,選擇可能執(zhí)行過的且容易波及的操作來執(zhí)行。
比如,在短消息測試中發(fā)現(xiàn)了收到消息中含有亂碼,那么在簡單編寫和發(fā)送的基礎(chǔ)上,可以擴(kuò)展的步驟可能是:
發(fā)送字符可能到達(dá)某一個特定值(比如空/滿1條/滿多條/全滿);
發(fā)送字符可能含有特殊字符(比如漢字、西歐字符等等);
接收方號碼可能為不同網(wǎng)絡(luò)號碼。
當(dāng)然,擴(kuò)展這些步驟的前提仍是基礎(chǔ)步驟沒有錯誤。只有基礎(chǔ)步驟正確的情況下,我們后續(xù)的擴(kuò)展才是有效的。
(3) 走出經(jīng)驗的死角
如果在擴(kuò)展路徑后,仍然無法復(fù)現(xiàn)故障,那么我們需要開始考慮基本操作步驟是否正確。
就如上面所說的,擴(kuò)展復(fù)現(xiàn)路徑必須在基本操作無誤的情況下進(jìn)行,如果基本操作已經(jīng)被出錯,那么后續(xù)的操作肯定只會離真正的路徑越來越遠(yuǎn)了。
我們可以得到這樣的啟示,很多故障由于我們自己先入為主的錯誤定位,而忽略了其實際操作步驟。在尋找故障復(fù)現(xiàn)方法的時候,又受到經(jīng)驗的影響,只操作我們認(rèn)為重要的步驟。
所以此時,我們需要走出這個死角,以新的角度去認(rèn)識故障。
不妨推翻以往一切的假設(shè),從不可能出發(fā),執(zhí)行我們之前從未認(rèn)為有必要的操作,它的結(jié)果可能是出人意料的。
(4) 復(fù)現(xiàn)路徑的提煉
當(dāng)能百分百復(fù)現(xiàn)故障后,那么說明故障復(fù)現(xiàn)步驟是完整的。
這個時候,需要對故障的復(fù)現(xiàn)路徑進(jìn)行一個提煉,保證反饋給開發(fā)人員的是一個最精簡、最有效的步驟。
關(guān)于復(fù)現(xiàn)路徑的提煉,通常有最常用的兩種:
步驟遞減:在復(fù)現(xiàn)故障的基礎(chǔ)上一步一步減少操作步驟。比如之前需要進(jìn)行三個不同的并發(fā)操作才能復(fù)現(xiàn)該故障,那么可以減少到兩步,觀察是否復(fù)現(xiàn),最后把故障定位在唯一一個必須的操作步驟中。
步驟遞增:根據(jù)測試經(jīng)驗,分析操作步驟和故障的關(guān)聯(lián)性,將所有操作列出,只挑選最有關(guān)聯(lián)的幾個步驟操作。如果不復(fù)現(xiàn),再依次按關(guān)聯(lián)的大小增加操作步驟直至故障復(fù)現(xiàn)。
4 效果評價
本文結(jié)合用例執(zhí)行和自由測試的心得談及有效執(zhí)行測試的方法。
對于測試初學(xué)者來說,可以通過用例執(zhí)行來掌握測試思路,而對于有經(jīng)驗的測試人員來說則可以結(jié)合用例做好有目的的自由測試。
而關(guān)于復(fù)現(xiàn)故障的方法,本文進(jìn)行了一些梳理,可供測試人員參考,以達(dá)到有效測試的目的。
5 推廣建議
本文介紹了個人的測試執(zhí)行心得,并對歸納故障復(fù)現(xiàn)路徑的方法進(jìn)行一些介紹,為后續(xù)測試執(zhí)行人員提供參考。