探索式软件测试
?
James A.Whittaker [美]?詹姆斯·惠特克(軟件測試領(lǐng)域絕對(duì)的大師)著作《Exploratory Software Testing》,中文名《探索式軟件測試》,記得當(dāng)時(shí)被這本書深深吸引啦(我不知道有多少做測試的小伙伴看過這本書)!感覺是測試方面一本必不可少的書籍,瞬間感覺測試的魅力!廢話不多說,直接來干貨,希望可以給對(duì)探索式測試喜歡或者感興趣的小伙伴一點(diǎn)幫助!
測試人員進(jìn)行測試時(shí)必須回答如下的問題。
(1)軟件運(yùn)行時(shí)的表現(xiàn)是否符合設(shè)計(jì)預(yù)期?
(2)用戶為了某個(gè)功能而購買了軟件,可是該軟件是否實(shí)現(xiàn)了這個(gè)功能?
(3)軟件運(yùn)行時(shí),是否足夠快、足夠安全、足夠穩(wěn)定,等等?
從許多方面來講,測試的目的就是在這次測試中盡最大努力,同時(shí)確保下次可以做得更好。恰好探索式測試法可以提供很好的指導(dǎo)。
主要有兩種指導(dǎo)方法,它們都可以幫助測試人員做具體決策。一種稱為局部探索式測試法,它輔助測試人員在測試過程中即時(shí)作出決定。另一各稱為全局探索式測試法,它用于幫助測試人員設(shè)計(jì)整體測試計(jì)劃和測試策略。
如果把探索式測試和實(shí)質(zhì)和使用腳本的手工測試合并起來,可以得到第三種探索式測試法,即混合探索測試技術(shù)。下面將分三部分來說明:
一、局部探索式測試法(exploratoy testing in the small)
此方法輔助測試人員在測試過程中即時(shí)作出決定。測試人員不需要知道很多信息就可以完成某些測試,比如決定文本框的輸入值,如何解釋錯(cuò)誤消息,如何理解前一次后一次輸入值之間的關(guān)系。
解決測試人員很多細(xì)節(jié)問題,它并不適合建立一個(gè)完整的測試架構(gòu),也不應(yīng)該用于測試用例的整個(gè)設(shè)計(jì)過程。
主要關(guān)注下面五個(gè)方面:
1、用戶輸入 ?輸入指的是由環(huán)境產(chǎn)生的一種刺激,該刺激導(dǎo)致被測試的應(yīng)用程序有所響應(yīng)。
? ? ? ? ? ? ? ? ? 測試包括合法輸入和非法輸入、輸入篩選器、輸入檢查、異常處理代碼、默認(rèn)輸入或用戶提供的輸入、使用輸出指導(dǎo)輸入選擇。
2、狀態(tài) ?軟件的一個(gè)狀態(tài)就是狀態(tài)空間中的一個(gè)點(diǎn),它由所有內(nèi)部數(shù)據(jù)結(jié)構(gòu)的取值來唯一確定。
? ? ? ? ? ? 應(yīng)用程序和其運(yùn)行環(huán)境進(jìn)行交互和接收到的所有輸入導(dǎo)致軟件狀態(tài)發(fā)生變化。測試人員就是測試這些狀態(tài)變化的情況。測試其是否正確更新了自身的當(dāng)前狀態(tài)?是不是進(jìn)入了一些它不應(yīng)該進(jìn)入的狀態(tài)?
? ? ? ? ? ? 輸入和狀態(tài)之間的關(guān)系相當(dāng)關(guān)鍵,在局部探索式測試法建議如下方式:
? ? ? ? ? ?1)使用狀態(tài)信息來幫助尋找相關(guān)的輸入
? ? ? ? ? ?2)使用狀態(tài)信息來辨識(shí)重要的輸入序列
3、代碼路徑 ?一條代碼路徑就是一連串的代碼語句,它起始于軟件開始運(yùn)行的語句,終止于一條特定的語句,往往就是那條代表軟件運(yùn)行結(jié)束的語句。
? ? ? ? ? ? ? ? ? 測試人員必須明確知道程序里可能有哪些分支,并理解哪些輸入會(huì)導(dǎo)致軟件走這條分支而不另一條。
4、用戶數(shù)據(jù) ?如果預(yù)期軟件需要存取海量的數(shù)據(jù)存儲(chǔ),比如一個(gè)數(shù)據(jù)庫或大批量的用戶文件,就需要在測試環(huán)境中設(shè)置一個(gè)數(shù)據(jù)存儲(chǔ)。且該數(shù)據(jù)應(yīng)該和軟件真實(shí)用戶使用的數(shù)據(jù)盡量一致。
5、運(yùn)行環(huán)境 ?就是使用的操作系統(tǒng)和它的當(dāng)前配置,還包括運(yùn)行在同一操作系統(tǒng)上會(huì)和被測試軟件進(jìn)行交互的其他一些應(yīng)用程序,包括會(huì)間接或直接影響被測軟件本身或影響被測軟件運(yùn)行的任何驅(qū)動(dòng)程序、代碼、文件、設(shè)置等,還包括軟件當(dāng)前連接的網(wǎng)絡(luò)情況、網(wǎng)絡(luò)的可用帶寬、性能等。
二、全局探索式測試法(exploratory testing in the large)
此方法用于幫助測試人員設(shè)計(jì)整體測試計(jì)劃和測試策略。幫助測試人員在全局方面所必須做出的各種決定,比如在考慮特性交互、數(shù)據(jù)流以及在應(yīng)用程序的用戶界面上如何選擇不同路徑完成某些實(shí)際功能時(shí)。不再考察在單個(gè)輸入面板上充當(dāng)中間用途的原子輸入,轉(zhuǎn)而討論那些可以幫助測試達(dá)到更重要目的的輸入。實(shí)際上需要我們?cè)陂_始就做出一個(gè)全局目標(biāo),用于指導(dǎo)以后的測試過程。使用全局探索式測試法,做出的決定一僅僅影響單個(gè)的對(duì)話框或者單個(gè)用戶界面,它的范圍涉及到軟件的全局。不僅僅是確定如何測試某個(gè)單一功能,而是確定了如何對(duì)軟件進(jìn)行探索式測試的整體方向。
主要參考于漫游測試,漫游測試法為測試提供了一個(gè)構(gòu)架,它可以幫助測試人員創(chuàng)建出比使用自由發(fā)揮的方式更有趣、也更有針對(duì)性的用戶場景。它也為測試人員設(shè)定了一個(gè)目標(biāo),引導(dǎo)他們嘗試更有趣和復(fù)雜的使用路徑。漫游測試既能幫助測試人員思考如何測試應(yīng)用程序,又能幫助他們組織實(shí)際的測試。當(dāng)然這一系列的測試法可以編成一張測試核對(duì)表,這樣可以避免測試人員遺漏某種測試類型,也可以幫助測試人員把應(yīng)用程序的功能和適合這些功能的測試技術(shù)相匹配。
此外,這些測試法還可以幫助測試人員做出無數(shù)的決定,如何決定測試路徑,如何選擇輸入值,使用哪些參數(shù)進(jìn)行測試。在無數(shù)的決定中,對(duì)比選擇不同的測試法,體會(huì)其精髓。這樣算得上是真正意義上的測試指南。
根據(jù)漫游測試把軟件不同區(qū)域類型,下面就不同區(qū)的相應(yīng)測試一一說明:
1、商業(yè)區(qū)測試類型 ?側(cè)重測試產(chǎn)品的賣點(diǎn)特性,并指導(dǎo)測試人員如何對(duì)這些特性的軟件代碼路徑進(jìn)行測試。有如下測試法:
1)指南測試法 ?要求測試人員通過閱讀用戶手冊(cè)并嚴(yán)格遵照手冊(cè)的建議執(zhí)行操作。
2)賣點(diǎn)測試法 ?測試人員應(yīng)該觀摩那些銷售演示,觀看銷售錄像并跟著銷售人員一起拜訪客戶。按照產(chǎn)品演示的步驟自己來執(zhí)行一遍,并看看有沒有發(fā)生問題。
3)地標(biāo)測試法 ?測試人員提前確定那些關(guān)鍵的軟件軟性,就是這里的地標(biāo),在選擇完地標(biāo)后,需要確定它們的前后順序,然后從一個(gè)地標(biāo)執(zhí)行到另一個(gè)地標(biāo)來探索應(yīng)用程序,直到訪問了列表中的所有地標(biāo)。
4)極限測試法 ?測試人員采用的途徑是向軟件提出很多難以回答的問題。比如如何使軟件發(fā)揮到最大程度?哪個(gè)特性會(huì)使軟件運(yùn)行到其設(shè)計(jì)極限?
5)快遞測試法 ?測試人員專注數(shù)據(jù)。應(yīng)該確認(rèn)那些被存儲(chǔ)起來的輸入數(shù)據(jù)并“跟隨”它們走遍軟件。
6)深夜測試法 ?測試人員關(guān)注主要特性外的代碼運(yùn)行情況,如各種維護(hù)任務(wù)等、應(yīng)該程序自動(dòng)做的些事情。變種的有清晨測試法,目的是測試軟件的啟動(dòng)過程和腳本。
7)遍歷測試法 ?測試人員通過選定一個(gè)目標(biāo),然后使用可以發(fā)現(xiàn)的最短路徑來訪問目標(biāo)包含的所有對(duì)象。
2、歷史區(qū)測試類型 ?主要針對(duì)老的功能和缺陷修復(fù)代碼。
1)惡鄰測試法 ?隨著測試的深入,發(fā)現(xiàn)和報(bào)告越來越多的缺陷后,就可以把缺陷數(shù)目產(chǎn)品特性聯(lián)系起來,從而可以跟蹤究竟在哪些地方會(huì)出現(xiàn)產(chǎn)品的缺陷。
2)博物館測試法 ?那些老代碼或者接受重新修改,或者是沒有被改動(dòng)就放到新環(huán)境中運(yùn)行,很容易發(fā)生失效的情況。故應(yīng)該也要測試遺留代碼和老的可執(zhí)行文件。
3)上一版測試法 ?如果當(dāng)前產(chǎn)品構(gòu)造是對(duì)先前版本的更新,很重要的一點(diǎn)就是必須運(yùn)行先前版本上支持的所有場景和測試用例。可以可驗(yàn)證用戶已熟悉的功能在新產(chǎn)品上依然可行。如果新版本重新實(shí)現(xiàn)或者刪除了一些功能,測試人員應(yīng)該選擇新版本定義方法來輸入數(shù)據(jù)和使用軟件。仔細(xì)檢查那些在新版本中無法再運(yùn)行的測試用例,以確保產(chǎn)品沒有遺漏必需的功能。
3、娛樂區(qū)測試類型 ?這類測試幫助測試人員測試那些輔助特性,而不是主線特性,并確保這兩種特性能夠?qū)嵱枚钟幸饬x地結(jié)合在一起。
1)配角測試法 ?鼓勵(lì)測試人員專注于某些不是用戶主要使用的特性,但是會(huì)和主要特性一同出現(xiàn)在顯示器上,它們?cè)骄o鄰主要功能,越容易被人注意,所以必須給予重視。
2)深巷測試法 ?如果測試部門跟蹤了代碼的覆蓋率,這個(gè)測試法要求測試人員想辦法去測試那些還沒有被沒測到的代碼。變種混合測試法,就是試著把最流行和最不流行的特性放在一起混著測。
3)通宵測試法 ?測試人員會(huì)讓程序一直保持運(yùn)行,而不去關(guān)閉它。即連續(xù)不斷地使用某些特性或者將文件一直保持在打開的狀態(tài)。
4、旅游區(qū)測試類型 ?關(guān)心的是快速訪問軟件的各種功能。
1)收藏家測試法 ?建議測試收集軟件的輸出,收集得越多越好。應(yīng)該確保能觀察到軟件能生成的任何一個(gè)輸出。比如對(duì)于文本處理器,要確保它能打印、拼寫檢查、格式化文本等。
2)長路徑測試法 ?就是測試離應(yīng)用程序開始點(diǎn)盡可能遠(yuǎn)的特性。比如哪個(gè)特性需要點(diǎn)擊N次才能被用到?選擇那個(gè)特性,一路點(diǎn)擊過去,然后測試它。這里的主要指導(dǎo)思想是到達(dá)目的地之前盡量多地在應(yīng)用程序中穿行。
3)超模測試法 ?重點(diǎn)不是在功能或測試功能間真正的相互作用,而只是測試界面。注意觀察界面上各個(gè)元素。比如它們有沒有被正確地繪制出來?性能是否良好?變化界面時(shí),刷新情況如何?圖形界面的按鈕和控件與期房值相符合?
4)測一送一測試法 ?測試同時(shí)運(yùn)行同一應(yīng)用程序多個(gè)拷貝的情況。即測試時(shí)運(yùn)行一個(gè)應(yīng)用程序,然后運(yùn)行該程序的另外一個(gè)拷貝,然后再運(yùn)行一個(gè)拷貝。
5)蘇格蘭酒吧測試法 ?適用于大規(guī)模的復(fù)雜應(yīng)用程序。對(duì)于程序某些地方,測試人員需要事先知道如何看到他們。可以找到用戶組并參與他們的討論,讀產(chǎn)業(yè)博客,花大量時(shí)間深入了解待測的應(yīng)用程序。
5、旅館區(qū)測試類型 測試人員放過那些主要的和最受歡迎的功能,而去測試一些經(jīng)常被忽視的或者在測試計(jì)劃中較少描述的次要及輔助功能。
1)取消測試法 ?就是啟動(dòng)操作然后停止它。比如打印文件并在文件打印完成之前就取消打印。可對(duì)任何提供取消選擇的功能或者需要較長時(shí)間才能完成的功能做同樣的操作。至少應(yīng)該確信被取消的操作可以再次執(zhí)行并成功結(jié)束。
2)懶漢測試法 ?測試人員做盡量少的實(shí)際工作,就意味著軟件接受所有默認(rèn)值……關(guān)注軟件是否對(duì)默認(rèn)值進(jìn)行了處理,是否運(yùn)行處理空白輸入的代碼。
?6、破舊區(qū)測試類型?
1)破壞測試法 ?測試人員試圖利用每個(gè)可能的機(jī)會(huì)暗中破壞應(yīng)用程序。a.強(qiáng)迫軟件做一些操作b.掌握軟件成功完成操作必須使用的資源c.在不同程序上移除那些資源或者限制使用那些資源。比如增加或者刪除文件,改變文件權(quán)限,斷開網(wǎng)線,在后臺(tái)運(yùn)行其他應(yīng)用程序,把要測試的應(yīng)用程序布署在有問題的機(jī)器上等。
2)反叛測試法 ?要求輸入最不可能的數(shù)據(jù),或者已知的惡意輸入。如果真正的用戶輸入字母a,那么使用反叛測試人員就永遠(yuǎn)不輸入a,取而代之的是去找些沒意義的輸入值。
有三個(gè)方法可實(shí)現(xiàn)反叛行為:
a.逆向測試法 每次輸入那些最不可能的數(shù)據(jù) 為了測試應(yīng)用程序的錯(cuò)誤處理能力。
? b.歹徒測試法 輸入一些不應(yīng)該出現(xiàn)的數(shù)據(jù) 測試人員在測試中違反輸入會(huì)導(dǎo)致很多錯(cuò)誤消息,輸入突破限制的數(shù)據(jù)
c.錯(cuò)序測試法 要求測試人員以錯(cuò)誤的順序做事情。
3)強(qiáng)迫癥測試法 ?強(qiáng)迫測試人員一遍又一遍地個(gè)輸入同樣的數(shù)據(jù),反反得得地執(zhí)行相同的操作。比如在屏幕上輸入一些數(shù)據(jù),然后馬上回來再輸入一次,看看開發(fā)人員是否編寫了錯(cuò)誤處理程序。
三、混合探索式測試技術(shù)
探索式測試可以和場景測試結(jié)合起來,幫助測試人員為給定場景引入大大小小的各種變化。如果場景描述的是用戶要采取的某些特定動(dòng)作,下面的技術(shù)就可以用來改變這些動(dòng)作的順序,并從場景中派生出衍生場景,用于測試不同狀態(tài)和不同代碼路徑。此技術(shù)主要使用基于場景的探索式測試,這種形式的探索式測試采用了給場景注入變化的方法。通過有系統(tǒng)地考慮輸入選擇、數(shù)據(jù)使用和環(huán)境條件,一個(gè)場景可以演變出許多測試用例。使用了兩個(gè)主要技術(shù):場景操作和漫游測試。
1、通過場景操作引入變化 ?為了使測試人員以更系統(tǒng)更策略的方式考慮替換路徑,引入了場景操作,就是對(duì)場景的步驟加以操作,來給場景注入變化。
1)插入步驟 ?給場景增加額外的步驟可使它們更加多樣化,從而測試更多的功能。
可以用到發(fā)下這些類型
a.增加更多數(shù)據(jù)
b.使用附加輸入
c.訪問新的界面
注意這些步驟最終都需要測試人員返回到原始場景。我們的目的是加強(qiáng)場景,而不是徹底改變場景的基本目標(biāo)。
2)刪除步驟 ?我們可以去年冗余和可選的步驟,這個(gè)操作的想法是使場景的步驟盡可能地減少。也許因此而衍生的場景會(huì)缺乏那些設(shè)置初始條件的步驟,這種場景可以用來測試應(yīng)用程序是否可以識(shí)別出現(xiàn)在缺少信息或者缺乏一些從屬功能。
3)替換步驟 ?如果場景中某些步驟可以有多種方法完成,就可以用替換步驟的場景操作來修改這個(gè)場景。實(shí)際上是前面兩個(gè)操作的組合,就是先刪除步驟,然后再插入步驟。故測試人員必須研究其他替代的方法來執(zhí)行場景中每個(gè)步驟或動(dòng)作。
4)重復(fù)步驟 ?場景經(jīng)常包含非常明確的動(dòng)作順序。重復(fù)步驟的場景操作通過重復(fù)單獨(dú)的步驟或者重復(fù)一組步驟來改變這個(gè)順序,以創(chuàng)建額外的變化。通過重復(fù)和重新安排步驟,我們可以測試新的代碼路徑,發(fā)現(xiàn)那些可能與數(shù)據(jù)初始化相關(guān)的缺陷。
5)替換數(shù)據(jù) ?理解應(yīng)用程序連接和使用的數(shù)據(jù)源,并確保它們之前的交互是穩(wěn)定可靠的。比如通過讀取、修改或者操作數(shù)據(jù)來代替默認(rèn)的數(shù)據(jù)庫來測試當(dāng)前場景。比如如果數(shù)據(jù)源的現(xiàn)有記錄數(shù)增加了十倍,會(huì)發(fā)生什么情況?
6)替換環(huán)境 ?基本要點(diǎn)是測試場景本身并不改變,只是在軟件上執(zhí)行這些場景時(shí),所使用的系統(tǒng)發(fā)生了改變。
需要考慮的因素:
a.替換硬件 改變實(shí)測應(yīng)用程序所運(yùn)行的硬件。可以充分利用虛擬機(jī)的技術(shù)來完成這項(xiàng)任務(wù)。
b.替換容器 需要確保測試場景可以在用戶有可能使用的所有主要容器中運(yùn)行,如不同瀏覽器。
c.替換版本 被測應(yīng)用程序在老版本上運(yùn)行得怎么樣?
d.修改本地設(shè)置 測試應(yīng)用程序是否使用cookie或者在用戶機(jī)器上寫文件嗎?它使用本地注冊(cè)表嗎?如果用戶修改瀏覽器設(shè)置來限制這類活動(dòng)會(huì)怎樣?如果用戶直接改變應(yīng)用程序的注冊(cè)表設(shè)置會(huì)怎樣?作為測試人員,最好能在應(yīng)用程序發(fā)布前知道它如何處理上述情況。
2、通過漫游測試引入變化 ?場景操作側(cè)重于場景中小的、逐漸增加的變化以及可有可無的步驟,而漫游實(shí)際上可以創(chuàng)建出相當(dāng)長的和范圍更廣的衍生場景。
1)賣點(diǎn)測試法 ?模擬用戶已有的工作習(xí)慣,在原始場景中加入一些新功能,讓用戶使用過程通過學(xué)習(xí)某個(gè)功能,掌握它,然后隨著對(duì)應(yīng)用程序的熟悉而逐漸轉(zhuǎn)移到新功能上。
2)地標(biāo)測試法 ?從場景開始并從場景中選取特定功能的地標(biāo),然后隨機(jī)打亂這些地標(biāo)的順序,這樣得到的場景就和原始場景不同了。如有必要,重復(fù)這個(gè)過程,不斷用新地標(biāo)順序來運(yùn)行測試。
3)極限測試法 ?檢查并修改場景以使軟件更加努力地工作,即挑戰(zhàn)軟件,向它提困難的問題。如很長的字符串輸入會(huì)產(chǎn)生問題嗎?
4)深巷測試法 ?關(guān)注使用最不可能用到的或者最沒有用的功能。
5)強(qiáng)迫癥測試法 ?重復(fù)場景中的每個(gè)步驟兩次或者三次。比如在軟件中四處移動(dòng)數(shù)據(jù)歷來可以有效的找到重要缺陷。
6)通宵測試法 ?當(dāng)測試場景可以被自動(dòng)化或者可以被錄制回放時(shí),最適合使用的是通宵測試法,只需要不斷重復(fù)運(yùn)行場景而不需退出被測應(yīng)用程序。
7)破壞測試法 ?在運(yùn)行場景測試時(shí),在資源調(diào)用處進(jìn)行破壞活動(dòng)。如場景要求在網(wǎng)絡(luò)上傳輸數(shù)據(jù),可以執(zhí)行步驟之前或者之中拔掉網(wǎng)線等。
8)收藏家測試 ?執(zhí)行場景和衍生場景時(shí)用文檔記錄下所觀測到的每個(gè)輸出。
9)超模測試法 ?運(yùn)行場景時(shí)只關(guān)注界面。確保所有元素都在它們應(yīng)該在的位置上,界面應(yīng)該設(shè)計(jì)合理,尤其要注意可用性問題。
10)配角測試法 ?測試人員不是執(zhí)行測試腳本描述的功能,而是找到最近的鄰近功能來執(zhí)行。
11)取消測試法 ?不但充分利用取消按鈕(運(yùn)行場景時(shí)只要看到它就點(diǎn)擊),而且執(zhí)行了啟動(dòng)和停止功能。如在開始執(zhí)行某些功能時(shí),通過取消或者Esc來取消。
12)混票測試法 ?從一個(gè)場景跳到另一個(gè),從而把兩個(gè)或者更多場景結(jié)合為一個(gè)具有混合目的的場景。檢查所有的場景并找出那些通用數(shù)據(jù),側(cè)重于通用功能。
靜態(tài)場景測試和探索式(漫游)測試并不沖突。場景可以代表探索式測試的一個(gè)絕佳起點(diǎn),探索可以給場景加入寶貴的變化,否則場景將很有限。明智的測試人員會(huì)把這兩種方法結(jié)合起來,以便更好地覆蓋應(yīng)用程序,得到更多輸入序列、代碼路徑和數(shù)據(jù)使用的變化。
總結(jié):凡是研究過探索式軟件測試的測試人員絕對(duì)會(huì)發(fā)現(xiàn)這是種可以給你們提供更多測試思路,可以找到軟件更多缺陷,從而更確保軟件的正確性、穩(wěn)定性等等。當(dāng)然由于其中思路方法之多,也絕不是看一兩下就可以體會(huì)的,需要測試人員多次閱讀并在實(shí)踐中努力嘗試其中的方法,不求全部用到,只用到其中一部分,我想肯定會(huì)給自己帶來很大的感受。正如大師所言,軟件測試是必不可少但有難度的事,望所有測試人員任重道遠(yuǎn)!
總結(jié)
- 上一篇: python基础小白题4
- 下一篇: 并查集实现