《探索式軟件測試》讀書筆記(上)
2015-05-12
一、局部探索式測試
1.如何測試用戶輸入
1)合法輸入和非法輸入
輸入篩選器
輸入檢查
異常處理代碼
2)常規輸入還是非常規輸入
3)默認輸入或用戶提供的輸入
4)使用輸出來指導輸入選擇
2.如何測試軟件狀態
3.代碼路徑
4.用戶數據
5.運行環境
二、全局探索性測試
分類 | 方法 |
商業區 | 指南測試法 |
賣點測試法 | |
地標測試法 | |
極限測試法 | |
快遞測試法 | |
深夜測試法 | |
遍歷測試法 | |
歷史區 | 惡鄰測試法 |
博物館測試法 | |
上一版測試法 | |
旅游區 | 收藏家測試法 |
長路徑測試法 | |
超模測試法 | |
測一送一測試法 | |
英格蘭酒吧測試法 | |
娛樂區 | 配角測試法 |
深港測試法 | |
通宵測試法 | |
旅館區 | 取消測試法 |
懶漢測試法 | |
破舊區 | 破壞者 |
反叛測試法 | |
強迫症測試法 |
三、混合探索式測試技術
1.通常有價值的場景會做下面一些事情:
2.使用基於場景的探索式測試
1) 通過場景操作引入變化
2) 通過漫游測試引入變化
一、局部探索式測試
1.如何測試用戶輸入
輸入定義:輸入必須導致軟件執行某些代碼,並以某種方式作出反應(不反應也算一種反映)。
1)合法輸入和非法輸入
大多數開發人員都不喜歡寫錯誤處理代碼
輸入篩選器
輸入篩選器:用於防止非法的輸入值被傳遞給應用軟件的功能代碼。
如何測試?
- 是否正確實現了該功能
- 是否可以繞過屏蔽器?比如可以通過編輯Web頁面的HTML源代碼來修改輸入篩選器,或修改通過輸入篩選器輸入的值,那么后面的代碼還要進行輸入檢查。
輸入檢查
輸入檢查:它們會接收一條輸入,如果輸入值合法則接着處理,否則產生一條錯誤消息並中止處理。
如何測試?
- 我們必須仔細閱讀每一條錯誤信息,檢查該錯誤信息是否寫錯了,錯誤信息還可以透露開發人員編程時的一些想法。錯誤信息一般會指出當前輸入值被認定為非法值的根本原因,及如何修正。這可以給我們很多啟發(如哪些輸入可以觸發錯誤信息,哪些輸入應該導致報錯而軟件卻沒報錯等)
異常處理代碼
異常處理代碼:異常處理代碼就想一個錯誤檢測,但是它不對每一個輸入值進行檢測,異常代碼把整個例程當作一個整體看待,檢測其上發生的任何一個錯誤。
如何測試?
- 如果測試人員看到這樣一個通用的出錯信息,可以接着反復測試同一段函數,繼續使用剛才出現異常的輸入數據,或者是稍微修改一下,看看會不會導致出錯;嘗試運行其他一些調用該函數的測試用例;接連不斷的引發異常很可能讓程序徹底崩潰。
2)常規輸入還是非常規輸入
- 常規輸入是開發人員計划的輸入,也是真實用戶經常用到的輸入。
- 非常規輸入只在比較特殊的情況下才發生,或者完全是由於某個機緣巧合才發生。
3)默認輸入或用戶提供的輸入
- 看到開發人員設置的默認值后,首要任務是把默認值刪除,留下一個空白的字段。
- 接着嘗試輸入在默認值附件的一些其他值,如果是字符串,可修改默認字符的頭部幾個字符,尾部幾個字符,添加或刪除幾個字符。
- 還可嘗試使用和默認字符具有相同長度但不同字符的字符串。
4)使用輸出來指導輸入選擇
- 先觀察輸出結果,然后再選擇新的輸入,並保證新的輸出是重新計算后的結果,或者是確保新的輸出與原先不同。
- 很多時候,第一次測試的是軟件處於一個未被初始化的狀態時如何產生輸出,而第二次測試是軟件處理一個已被初始化的狀態時如何產生輸出。
- 修改被保存起來的輸出結果,可以測試這些值是否在原值的基礎上被重新生成了。
2.如何測試軟件狀態
可以這么來看待軟件狀態,在我們選擇下一步使用哪個輸入時,必須考慮從前使用過那些輸入所造成的累計效應。
軟件狀態的定義(非正式):軟件的一個狀態就是狀態空間中的一個點,它由所有內部數據結構的取值來唯一確定。
軟件狀態可以看成是用於描述軟件記住過去發生的所有輸入和輸出的一種方式。狀態可以是臨時的(當程序中止時,該狀態就被忘記了),也可以是長期保存的。
輸入和狀態之間的關系相當關鍵。
測試建議:
- 使用狀態信息來幫助尋找相關的輸入。測試輸入的各種組合可以說是測試的一個基本常識。如果兩個或多個輸入在某種程度上是相關聯的,那么它們應該放在一起測試。
- 使用狀態信息來辨識重要的輸入序列
3. 代碼路徑
測試人員必須明確知道程序里可能有哪些分支,並理解哪些輸入會導致軟件走這條分支而不是另一條
4.用戶數據
5.運行環境
二、全局探索性測試
探索式測試的幾個目標:
- 理解應用程序如何工作,它的接口看起來怎樣,它實現了哪些功能;
- 強迫軟件展示其全部能力;
- 找到缺陷。
漫游測試 - 這是本書的核心內容,它用旅游來類比測試過程。旅游地點一般可或划分為商業區、歷史區、旅游區、娛樂區、旅館區、破舊區,我們的測試軟件也包含與這些“區域”,可根據不同區的特征,有針對性的進行測試。具體如下:
1. 商業區
商業區- 相當於軟件包裝盒上描述的那些特性,及市場商業活動中或者銷售演示中的各種特性和實現這些特性的代碼。
- 指南測試法 - 要求測試人員通過閱讀用戶手冊並嚴格遵照用戶手冊的建議執行操作。
- 賣點測試法 - 銷售人員都是為賣點測試法提供信息的絕佳來源。這個測試法的新奇之處是使用競爭對手的用戶手冊來測試自己的軟件。這非常適合競爭對手是市場領先者,而自己產品在其后緊追希望超越對手的情況。進行賣點測試法的人員應該觀摩銷售演示,觀看銷售錄像並跟着銷售人員一起拜訪客戶。 注意:出席銷售人員給客戶的演示會,與銷售人員保持良好的關系,這些都會使測試人員在使用賣點測試法時獲得優勢。
- 地標測試法☆ - 通過指南測試法和賣點測試法,可以提前確定那些關鍵的軟件特性,也就是這里的地標。選擇完地標后,需確實它們的順序,然后從一個地標執行到另一個地標,直到訪問了列表中所有的地標。地標變種:選擇多個起始地標,在執行開始后增加新地標,改變各個地標的前后訪問順序等。
- 極限測試法☆ - 向軟件提出很多難以回答的問題。比如如何使軟件發揮到最大程度,哪個特性會使軟件運行到其設計極限,哪些輸入和數據會耗費軟件最多的運算能力,哪些輸入可能欺騙它的錯誤檢測例程,如果軟件用於產生某些特定的輸出時,使用哪些輸入和內部數據可以不斷挑戰軟件的這種能力。
- 快遞測試法 - 這個測試法中,測試人員應該專注於數據。應該確認那些被存儲起來的輸入數據並“跟隨”它們走遍軟件。
- 深夜測試法 - 營業時間之后,軟件中執行賣點測試的代碼可能不運行了,但是還可能執行各種維護任務,將數據歸檔,備份文件,等等。
- 遍歷測試法 - 通過選定一個目標(如所有的菜單項,所有錯誤消息或者所有對話框),然后使用可以發現的最短路徑來訪問目標包含的所有對象。測試中不追求細節以免影響測試速度,遭遇只檢查那些明顯的東西。
2. 歷史區
歷史區 - 從前版本遺留下來的代碼,還有那些曾經出現過較多缺陷的特性和功能。
- 惡鄰測試法 - 測試人員不能提前預知哪些軟件特性稱得上惡鄰,隨着測試的深入,可以把缺陷數目同產品特性聯系起來。由於缺陷通常扎堆兒出現,因此產品缺陷多的地方值得反復測試。實際上,一旦確定了某個代碼區缺陷很多,我建議對鄰近功能使用變例測試法進行測試。
- 博物館測試法 - 主要針對遺留代碼,最初的開發人員已經離開了很長時間,而且缺乏文檔。在這個測試法中,測試人員應該找出那些遺留代碼和老的可執行文件,並確保它們在測試中受到和新代碼同樣的待遇。
- 上一版測試法 - 如果當前產品構造是對先前版本的更新,必須先運行先前版本上的支持的所有場景和測試用例。
3. 旅游區
旅游區- 有些特性和功能對新用戶非常有吸引力,然而老用戶不再使用他們。
- 收藏家測試法 - 該測試法建議我們收集軟件的輸出,收集得越多越好。
- 長路徑測試法 - 哪個特性需要點N次才能被用到?選定那個特性,一路點過去,然后測試它;哪個特性需要經過最多的界面才能訪問?選定它,然后進行測試。這里的主要思想是到達目的地之前盡量多地的應用程序中穿行。選擇長的路徑,把埋在應用程序最深處的界面作為測試目標。
- 超模測試法 - 這個測試法,要求測試人員去關心那些表面的東西。只測試界面。測試中注意觀察界面上各種元素。它們看上去怎么樣?有沒有被正確的繪制出來?它們的性能是否良好?變化界面時,圖形用戶界面刷新情況如何?如果軟件用顏色來傳達某種意思,這種信息是否一致?界面是否違反了任何慣例或標准?
- 測一送一測試法 - 只測試同進運行同一應用程序多個拷貝的情況。讓各個程序在內存中做些事情,同時在磁盤上做些事情。試着用所有的不同拷貝同時打開同一個文件,或者讓它們同時在網絡上傳輸數據。備注:為什么叫測一送一,因為如果有一個拷貝上發現了一個缺陷,就在所有的拷貝上發現了同樣的缺陷。
- 英格蘭酒吧測試法 - 特別適用於大規模的復雜應用程序。在這些應用程序的有些地方,測試人員需要事先知道如何去找到它們。也就是說要找到用戶組並參與他們的討論,讀產業博客,花大量時間深入了解待測的應用程序。
4. 娛樂區
娛樂區- 軟件也有一些輔助特性和功能,用於精疲力竭之后的休閑娛樂。
- 配角測試法 - 鼓勵測試人員專注於某些特定的特性,它們雖然不是我們希望用戶使用的主要特性,但和那些主要的特性一同出現在顯示器上。
- 深巷測試法 - 建議測試人員應該測試該使用情況列表中排在最下面的幾項特性。該測試法要求測試人員想辦法去測試還沒有測試到的代碼。深港測試法的一個變種-混合測試法,嘗試將最流行和最不流行的特性放在一起混着測試。
- 通宵測試法 - 這里的關鍵是通宵,必須從不中斷。讓程序一直保持運行,而不去關閉它。測試可能出現的問題:內存泄露、數據毀壞、競態條件等。
5. 旅館區
旅館區- 當軟件“休息”時,它實際上是非常忙碌的。
- 取消測試法 - 其思想是啟動操作然后停止它。也可以嘗試開始一個操作,不要停止它,然后開始另一個同樣的操作。我們應該假定用戶偶爾會取消一些操作,但是他可能馬上又重新做了一次相同的操作。
- 懶漢測試法 - 有時候什么也不做反而會迫使軟件執行得更繁忙,因為當用戶留下數據字體空白時,程序正盡頭執行IF-Then-Else條件中的Else來尋找下一步要做什么;當用戶不做決定時,默認的邏輯也會執行大量的操作。懶漢測試法指測試人員做盡量少的實際工作。
6. 破舊區
- 破壞者 - 在這種方法中,我們會試圖利用每個可能的機會機會暗中破壞應用程序。強迫軟件做一些操作;掌握軟件成功完成操作必須使用的資源;在不同程度上移除那些資源或限制使用資源。
- 反叛測試法 - 要求輸入最不可能的數據,或者已知的惡意輸入。1)逆向測試法 每次都輸入那些最不可能的數據。2)歹徒測試法 這是關於如何處理非法輸入的測試法。基本想法是輸入一些不應該出現的數據,違反規則的數據等。3)錯序測試法 要求測試人員以錯誤的順序做事情。選擇一組合法的行為,將它們混在一起,造成前后順序不合法。例如在購物車空的時候結賬,或者退還一個沒買的貨物等。
- 強迫症測試法 - 反反復復的執行同樣的操作。
三、混合探索式測試技術
1.通常有價值的場景會做下面一些事情:
- 講述用戶故事 - 通常是記錄用戶使用軟件的動機、目的以及具體動作
- 描述需求
- 演示產品功能 - 這些場景出現在在線幫助或為用戶准備的書面說明書中
- 演示集成場景 - 描述功能在集成后是如何工作的,用戶在一些實際任務中如何使用這些集成后的功能
- 搭配設置和安裝
- 描述警告和出錯情形
2.使用基於場景的探索式測試
1) 通過場景操作引入變化
- 插入步驟:給場景插入一個或多個步驟能增加軟件失敗的機會。增加更多數據,使用附加輸入(比如添加一條產品評論后,對其他評論進行評分),訪問新的界面
- 刪除步驟:可使用遞進的方式重復場景,每次只刪除一個步驟。每減少一個步驟,場景都在被測軟件上執行一次,直到獲得一個最短的測試用例,然后循環結束。
- 替換步驟:如果場景中某些步驟可以有多種方法完成,就可以用替換步驟的場景操作來修改這個場景。
- 重復步驟
- 替換數據:這里的思路是理解應用程序連接和使用的數據源,並確保它們之間的交互是穩定可靠的
- 替換環境:如替換硬件,替換容器(如不同瀏覽器),替換版本,修改本地設置(應用程序是否使用Cookie或者在用戶機器 上寫文件嗎,使用本地注冊表嗎,如果用戶修改瀏覽器設置來限制這類活動會怎樣?如果用戶直接改變應用程序的注冊表設置會怎樣?)
2) 通過漫游測試引入變化
- 賣點測試法 - 為場景加入新功能
- 地標測試法 - 從場景中選取特定功能的地標,並打亂這些地標的順序
- 極限測試法 - 修改場景 以使軟件更加努力的工作,也可以說挑戰軟件,向它提困難的問題
- 深港測試法 - 是賣點測試法的變種,也是加入新功能,不過這里是加入不可能乃至的或最沒用的功能
- 強迫症測試法 - 重復場景中的每個步驟兩次或三次,可以按自己的喜好來做
- 通宵測試法 - 當測試場景可以被自動化或錄制回放時,最適合這個測試法。它需要不斷重復運行場景而不退出程序。選擇使軟件滿負荷的場景,使用內存或網絡,或者在其他方面消耗資源
- 收藏家測試法 - 執行場景和衍生場景時用文檔記錄下所觀測到的每個輸出,甚至可以根據產生的輸出數量來給場景打分。測試人員能否創建出新場景,讓它具有其他場景中沒有的輸出?能否創建一個可以產生最多輸出數據的超級場景。
- 超模測試法 - 強迫數據盡可能頻繁的顯示以尋找屏幕刷新問題
- 配角測試法 - 總是選那些在某種意義上“最鄰近”的選擇
- 取消測試法
- 混票測試法 - 檢查所有的場景並找出那些使用通用數據,側重於通用功能,或具有通用步驟的場景
參考
[1] 讀書筆記_《探索式軟件測試》