1. 程式人生 > >第4代白盒測試方法介紹--理論篇

第4代白盒測試方法介紹--理論篇

首先在被測函式上設定斷點,接著用指令碼構造除錯環境,包括修改變數、設定指令碼樁等,然後發起測試,在斷點觸發後的單步跟蹤狀態,觀察各個變數值是否預期,還可以修改變數使被測函式中特定分支能夠執行。最後在除錯完成時,可以將當前除錯操作,包括設定斷點、檢查變數值是否預期、修改變數等,自動轉化為測試指令碼。

上述檢視操作向自動指令碼轉換還解決測試資料構造問題,尤其在複雜系統中,構造測試資料比較麻煩,比如通訊協議的訊息包資料,建立訊息後要填寫數十,甚至數百個欄位的值。檢視操作可以在函式呼叫鏈中插入一段指令碼程式碼,比如被測程式碼先呼叫一個初始化協議訊息的函式,得到正確訊息包後傳遞給被測函式,我們通過插入指令碼,在被測函式執行之前修改傳入訊息包的特定欄位,從而實現特定路徑的覆蓋測試。採用該方法設計用例是非常廉價的,直接重用被測系統的區域性功能,免去了繁重的測試驅動構造工作。

檢視過程類似於除錯,主要差別如下:

1.檢視器斷點只在函式入口設定,偵錯程式可以在任意語句設斷點。

2.檢視既可以在IDE介面手工操作,也可以通過寫指令碼控制,偵錯程式一般只支援手工操作。

3.檢視器在斷點狀態下可以執行任意合法的測試指令碼,偵錯程式無此功能。

由於檢視器與程式語言自帶的偵錯程式實現原理不同,一般情況下兩者可以同時使用,可同時設定檢視斷點與除錯斷點。

4.2.3除錯就是測試

除錯為了定位問題,測試是為了發現問題,兩者雖不能互相替換,但當測試手段趨於豐富,測試工具也能越來多的承擔除錯職責。讓測試工具承擔部分除錯功能,可在如下方面獲益:

1.除錯與測試共享執行環境

被測程式碼片斷是在特定環境下執行的,無論除錯還是測試,都得先構造執行環境,比如準備特定的資料、修改狀態變數、啟動特定執行緒或任務。藉助測試工具線上構造測試驅動與測試樁,除錯環境能便利的搭建起來,而且,構造執行環境的指令碼能直接在相關測試用例中重用。

2.將不可重複的除錯轉化為可重複的測試

除錯過程具有隨意性與不可重複性,在哪兒設斷點、如何看變數、如何單步跟蹤都因人而異。除錯的操作過程難被重用,不像測試用例,以形式化指令碼記錄操作過程,想怎麼重複就怎麼重複,上節介紹的檢視器就是一種可重複的偵錯程式。

操作自動重複是提高工作效率的基本途徑,不必強求全過程重複,片斷可重複就能大幅提高效率了。

3.測試設計可以很好的重用被測系統中區域性功能

如上一節舉例,直接呼叫被測系統的訊息建構函式,能避開繁重的協議訊息模擬工作。

4.解決指令碼除錯與原始碼除錯的交叉影響問題

實踐證明,白盒測試的大部分時間消耗在指令碼編寫與除錯中,除錯好的用例,執行幾乎不要時間(即使要時間,挪到晚上讓它自己自動跑好了)。測試指令碼除錯與原始碼除錯是交叉進行的,單元測試中的原始碼與測試指令碼都不穩定,通常我們讓指令碼發起測試,須同時跟蹤指令碼與原始碼,檢視執行結果正不正確。如果這兩者除錯過程是分離的,調原始碼時不能看指令碼,或調指令碼時不能看被測變數,其操作過程必然非常痛苦。

當測試承擔起除錯職責,兩者合二為一,交叉影響的問題即自動解決。實事上,大家把測試當測試、除錯當除錯,很大程度上是因為沒把測試指令碼也看作產品程式碼,不把它當成產品固有部件,如果觀念轉變過來了,測試指令碼也是程式碼,除錯指令碼就是除錯程式碼,兩者本應合二為一的。當然,還存在工具的問題,缺少好工具,將兩者強扭一起最終仍會不歡而散。

4GWM嘗試讓測試工具承擔起90%的除錯工作,完全替換並非必要。如果測試工具能承擔大部分除錯,開發大迴圈就能拉通了。下圖是開發與測試尚未拉通,是孤立兩個過程的情況:

 設計迴圈圖

拉通開發大迴圈後,測試不再是獨立的閉環過程,如下圖:

拉通大迴圈後研發過程圖

測試設計(即寫指令碼)與產品設計(即編碼)融為一體,除錯指令碼與原始碼成為開發人員主要日常工作。上圖的結果評估,對於測試指令碼是覆蓋率,對於產品原始碼是其執行表現(其結果可能預期,也可能出差錯了),評估這兩者,再補充用例及完善原始碼,之後進入下一輪迭代迴圈。

除錯通過的指令碼打包到測試工程,就是能夠支援每日構建的用例庫;測試通過的原始碼經release釋出,就是在市場上能提供預期功能的正式產品。

4.2.4編碼、除錯、測試整合平臺

4GWM在方法論上要求大家把測試指令碼也看成產品程式碼,以黑盒調測代替大部分單步除錯,但方法論能否順利被實踐支援,還嚴重依賴於測試工具的品質。為此,4GWM要限定測試工具必須將編碼、除錯、測試整合到一個平臺。

該要求實際限定測試指令碼要擁有與原始碼一樣的權益,由於歷史原因,各主流語言的整合開發環境總是讓程式碼能在同一平臺下編輯、除錯的,現在既然把指令碼也看成一種程式碼,就應該賦予它同等權益。拿通俗的話來講,我們要構造一種整合平臺,集編碼、除錯、測試於一身,是為了讓“測試”這個後媽晉升級為親媽,原先“除錯”是親媽,佔盡天時地利,不妨從IDE讓出一些位置。

把調測一體化平臺作為4GWM特徵之一明確下來,可以防止4GWM在不同程式語言及不同測試工具下實施走樣。請注意,整合平臺的規定不是4GWM本質方法論,但4GWM對工具化支援有比較高要求,配套工具要有足夠的功能,能讓廣大開發人員隨心所欲的使用測試手段替代除錯。

4.3持續測試

4GWM第三個關鍵域是持續測試,包括3個關鍵特徵:

²測試設計先行

²持續保障信心

²重構測試設計

4.3.1測試設計先行

測試先行是XP典型實踐,XP中的測試先行是Test Driven DevelopmentTDD),4GWM規定的測試先行是Test Design FirstTDF),兩者主體內容應該一致,細節要求稍有差異。

為方便大家理解,我們還是從XPTDD基礎上介紹4GWMTDFTDD是測試驅動開發,測試程式碼在產品程式碼之前編寫,要求產品先能測試,然後在解決問題過程中補充設計或完善設計。一個簡單的TDD例子,比如我們要編寫一個函式GetHash計算某物件的hash值,定義GetHash函式的原型後,即開始設計用例,如:

// 確定函式原型

int GetHash(void *obj)

{

assert(0,”Not define yet.”);

}

// 設計用例

assert( GetHash(newObject(12)) == 12 );
assert( GetHash(newObject(”AName”)) == 63632 );

上述測試肯定通不過,所以要解決問題,先是整形物件的hash值算不對,我們在GetHash函式中新增處理分支:

int GetHash(void *obj)

{

if ( ObjType(obj) == dtInt )
{

...

return iHash;

}

assert(0,”Not define yet.”);

}

然後,再次執行用例發現字串物件的hash值也不對,再新增相應處理程式碼。

TDF也按上述模式操作,但相比TDD稍有差異,主要表現在:

1.TDD強調測試驅動開發,即:測試先做,然後在測試主導下完善被測系統。而TDF只是要求測試設計先做,並不強制測試程式碼總比被測功能先跑起來。

TDD要求一開始就寫規範的用例,而TDF更多的是讓除錯環境先跑起來,調測程式碼既可以是規範的用例,也可以是待整理的指令碼,即草稿狀態的用例。

2.TDD更傾向於自頂向下的開發模式,TDF則較少受此限制,實際操作時,使用最多的是混合模式。即:如果自頂向下比較容易操作,就自頂向下先設計用例,如果自頂向下不好操作,先自底向上先寫底層程式碼也無妨。

TDF通常採用三文治操作模式,即:先設計少量用例,讓調測環境順利跑起來,接著補充功能程式碼,最後再增加用例使新寫的程式碼能完整測試。因為功能編碼夾在中間,成為三文治的餡,過程的兩端都是用例設計。由於結構化設計的緣故,TDF三文治模式也是層層巢狀、依次深入的,先寫高層次測試指令碼,接著高層次編碼,然後補充高層次測試設計,之後進入下一層結構化設計,同樣先設計下層測試指令碼,接著下層功能編碼,再補充下層測試設計。

3.TDF要求儘可能高效的編寫用例,除錯操作可以轉化成用例,已測試通過的功能也可以在用例中重用,TDD對此沒有特別要求。

TDDTDF都強調儘可能在編碼之前設計用例,看得到程式碼後編寫用例容易墜入慣性思維陷阱,比如,某個被測函式少了一個分支處理,看自己寫的程式碼做測試,也同樣容易忽略這個分支。所以,先寫指令碼後寫程式碼可以檢驗設計是否合理,這時測試設計依據的是規格。

測試先行經XP實踐論證,整體是可行的, Boby GeorgeLaurie Williams的統計資料表明(參見《An Initial Investigation of Test Driven Development in Industry》),實施TDD,有87.5%的開發者認為能更好理解需求,有95.8%認為TDD有助於減少bug78%的人認為TDD提高了生產率,另外還有92%的人認為TDD能促進程式碼質量,79%的人認為TDD有助於簡化設計。同時,這份統計還表明,有40%開發者表示採用TDD比較困難,困難主要原因在於看不到程式碼情況下先做測試設計,容易讓人無所適從。

TDF在一定程度上克服TDD應用困難的弊端,它並不過於強調測試設計一定先於編碼,但要求先行編寫的測試指令碼與程式碼能儘早展現功能,或儘早的驗證規格,指令碼與程式碼一起對等的被設計者用來實施他的意圖——當然,遵循結構化設計原則,越高層越抽象的邏輯應先驗證,越重要的功能也應先驗證。儘早展現功能,也意味著:寫一點測一點、測一點寫一點,一有可展現或可除錯的小功能,測試設計總與功能編碼同步跟進的。

4.3.2如何持續保障信心

4GWM非常強調維持良好的客戶體驗,線上測試保證白盒測試所見即所得,人性化操作催生快感,拉通測試小迴圈與開發大迴圈,使工作效率大幅提高,強化了這種快感,現在再加一條:測試過程可度量,讓開發者至始至終都對自己的程式碼充滿信心,鞏固快感使個體愉悅延伸到團隊愉悅。

白盒測試最重要的度量指標是覆蓋率,包括語句覆蓋、分支覆蓋、條件覆蓋、組合條件覆蓋、路徑覆蓋、資料流覆蓋等。設計測試度量標準,不是種類越多就越好,也是越高標準(如路徑覆蓋、MCDC覆蓋)就越好,最重要的是,要恰如其分,另外還得考慮現實因素:測試工具能不能支援。尤其在持續測試模式下,恰當的選擇覆蓋指標尤顯重要,要求過高使測試成為累贅,必然讓持續測試做不下去。與一次測試不同,不恰當覆蓋指標帶來的負面影響,在持續迭代中放大了,稍過複雜就帶來很大傷害。

實踐經驗表明,常規的白盒測試拿語句覆蓋與分支覆蓋度量已經足夠,對於區域性邏輯複雜的程式碼,再增設MCDC覆蓋就夠用了。4GWM推薦把呼叫覆蓋(近似於語句覆蓋)當作主要測試指標,呼叫覆蓋是觀察函式呼叫與被呼叫關係的一種覆蓋指標,因為4GWM以函式為單位關注測試過程,函式是識別不同測試及同一測試中不同分層的依據,以呼叫關係度量測試程度,是這種基於呼叫介面、灰盒模式的測試方法論自然延伸。

除了覆蓋率指標,我們還得區別經意測試與不經意測試。比方測試某特定分支設計一個用例,除了你期望的分支跑到外,同一函式中其它部分的某些分支也能跑到,這是不經意產生的覆蓋率貢獻。不經意測試使結果評估產生偏差,也給想偷懶的員工帶來便利,比方,測試某通訊產品,設計用例打一個電話,就可能貢獻20%的覆蓋率。

為避免上述情況,4GWM設計出另一指標:測試設計程度(或稱用例覆蓋度),該指標分析測試工程中,被測函式呼叫次數與該函式分支總數的關係。一個函式分支越多,就應設計更多的用例來測試它。用例覆蓋度是作為基礎條件參與測試評估體系的,設定門檻閥值,過了門檻條件,即使多設計用例也不給測試效果加分,但沒過門檻,結果評估則是一票否決的。

4GWM要求測試工具以直觀、簡潔的方式隨時統計測試程度。因為是增量式設計,被測程式碼與測試指令碼都按對等速度遞增的,測試評估先要求定義測試觀察範圍,選中當前關注的被測原始檔與指令碼檔案,成為測試工程,然後,工具始終以工程為單位進行評估,在主操作介面顯示一個標誌燈,亮紅燈表示當前測試未通過,有bug等待先解決,亮黃燈表示測試通過了但覆蓋率指標不符合要求,亮綠燈表示滿足覆蓋指標並且測試通過。

遵循4GWM的軟體開發過程,就是時時刻刻要讓介面綠燈亮起的持續開發過程,這好比開車,功能編碼是踩油門,測試編碼是踩剎車,介面紅綠燈是執法標準,只亮綠燈才能往前走。規則已經很清晰了,時時刻刻遵守交規就是持續信心的保障。

4.3.3重構測試設計

做好人不難,難就難在一輩子都做好人(做壞人更難?沒見過一輩子只做壞事的人)。我們照章開車,沒人給你開罰單,但不意味著專案就沒問題了,方向走反了是南轅北轍,方向偏了可別指望歪打正著。同樣,要讓白盒測試能持續的跟進,很重要一點,測試設計要能快速重構。軟體設計總是難免出錯,事實上,多數產品開發都會經歷幾次區域性重構,當被測程式碼大幅調整,規模與之對等的測試程式碼如何快速修正成了迫切待解決的難題。

重構測試設計要依據被測程式碼,測試工具應儲存最近綠燈狀態時的原始碼資訊,比如,系統中都有哪些全域性符號(變數、函式),符號是什麼型別,被測函式都呼叫哪些子函式、都使用哪些全域性變數等。重構測試設計時,依據歷史被測程式碼與重構後代碼的差異,自動分析當前哪些用例會受影響,如何影響,再具體指出哪些指令碼行應作調整。這好比開車走錯路,要回頭想想在哪個十字路口開始錯的,錯在哪個方向。當上述過程有工具幫我們分析,維護用例的效率就高多了。

5結論

目前,4GWM已有實踐主要集中在C語言測試,線上測試、持續測試諸多實踐很早就有測試工具支援,已有數年應用積累。本文歸納的4GWM九大特徵,都來源於白盒測試長期實踐,先實踐後總結,先有具體應用,然後歸納出通用方法。

這裡再總結一下,上文介紹的3個關鍵域中,線上測試是基礎,是維持良好客戶體驗的第一步,線上測試不僅拉通測試小迴圈,初步解放生產力,而且,線上特性讓灰盒調測成為可能。灰盒調測拉通開發大迴圈,再次大幅度解放生產力。當測試效率兩度提升後,持續整合就不再困難了。

相關推薦

4測試方法介紹--理論

首先在被測函式上設定斷點,接著用指令碼構造除錯環境,包括修改變數、設定指令碼樁等,然後發起測試,在斷點觸發後的單步跟蹤狀態,觀察各個變數值是否預期,還可以修改變數使被測函式中特定分支能夠執行。最後在除錯完成時,可以將當前除錯操作,包括設定斷點、檢查變數值是否預期、修改變數等,自動轉化為測試指令碼。 上述

4測試方法通俗釋義

從第3代到第4代,堅持調測一體的理念後,測試程式碼與被測程式碼真正同等的看成一種產品程式碼,兩者程式碼一同新增、一併維護,不是把被測程式碼寫完整了再設計測試指令碼,維護兩者也是對等的,只要相關聯的程式碼一處修改了,另一處也要跟著改。不僅如此,兩者的除錯過程也可融為一體,除錯測試指令碼與除錯被測程式碼有許多共性

4測試方法實踐之“VcTester插裝原理與各種覆蓋率配置”

VcTester與常見C/C++語言覆蓋測試工具一樣,提供多種覆蓋率統計,已涵蓋語句覆蓋、分支覆蓋、條件分支覆蓋、MCDC覆蓋。本文講解VcTester的插裝實現原理、描述該工具的覆蓋率使用特點。 VcTester插裝實現原理 VcTester是基於函式呼叫進行覆蓋統計的,

4.3測試技術

白盒測試是基於測試物件的內部結構。白盒測試技術可以應用在所有測試級別,但本節討論的兩種與程式碼相關的技術最常用在元件測試級別上。有些更高階的技術會用於安全關鍵、任務關鍵,或高完整性環境以實現更徹底的覆蓋,但這裡不會討論。有關此類技術的更多資訊,請參見ISTQB高

[5]測試方法2—圖覆蓋準則

學習圖覆蓋準則需要了解一些其他基本概念。 可達:從某一個結點開始存在一條路徑可達子圖。 可達包括兩個方面:語法可達和語義可達。 語法可達:通過語法構建某種子圖結構當中,存在一條路徑可達到這個子圖。 語義可達:指在實際的程式當中存在這麼一個測試,可到到這個

測試方法-程式碼檢查法

程式碼檢查包括桌面檢查、程式碼審查和走查等,主要檢查程式碼和設計的一致性,程式碼對標準的遵循、可讀性,程式碼邏輯表達的正確性,程式碼結構的合理性等方面;發現違背程式編寫標準的問題,程式中不安全、不明確和模糊的部分,找出程式中不可移植部分、違背程式程式設計風格的內容,包括變

測試方法--邏輯覆蓋法

本文目的主要為軟考準備的複習內容。 例項程式碼: int method(bool a, bool b, bool c) { 1  int x; 2  x=0; 3  if(a && (b || c)) 4    x=1; 5  return x; } 1

測試之gmock入門

一、gmock是什麼 gmock是google公司推出的一款開源的白盒測試工具。gmock是個很強大的東西,測試一個模組的時候,可能涉及到和其他模組互動,可以將模組之間的介面mock起來,模擬互動過程。其作用就類似白盒測試中的打樁的概念。 下面簡單的說說打樁在白盒測試中的

4次作業類測試碼+105032014045+楊銘河

rfi color too efi rgs text blog ace val 1、類圖: 2、代碼: (1)計算類: class Arithmetic{  //邏輯計算類 private int headphoneNum; private int

4次作業類測試碼+019+李悅洲

stack app static jlabel field ted temp 函數 private 類圖: 代碼: package swingDesign; import java.awt.EventQueue; import javax.swing.JFra

4.6.4 測試(第二部分)

6.4 png image log nbsp src -128 logs 4.6 4.6.4 白盒測試(第二部分)

測試及其基本方法

白盒測試 出現 及其 路徑 bsp 取值 判定覆蓋 clas lan 強度由低到高:語句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。 (1)語句覆蓋:就是設計若幹個測試用例,運行被測程序,使得每一可執行語句至少執行一次。 (2)判定覆蓋:使設計的測試

軟體測試——黑測試方法

軟體測試 黑盒白盒的區別不用說了,這裡介紹黑盒白盒測試所用的方法,都是關於測試樣例的設計 白盒測試 語句覆蓋 每條語句至少執行一次 判定覆蓋 每一判定的每個分支至少執行一次

測試—六種覆蓋方法

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/write6/article/details/78702977  定義:    白盒測試又稱結構測試,透明盒測試、邏輯驅動測試或基於程式碼的測試。白盒測試是一種測試用例設計方法,

測試常用工具介紹

                白盒測試工具一般是針對程式碼進行測試,測試中發現的缺陷可以定位到程式碼級,根據測試工具原理的不同,又可以分為靜態測試工具和動態測試工具。靜態測試工具直接對程式碼進行分析,不需要執行程式碼,也不需要對程式碼編譯連結,生成可執行檔案。靜態測試工具一般是對程式碼進行語法掃描,找出不符

談談測試中的幾種覆蓋方法

 談談白盒測試中的幾種覆蓋方法  白盒測試用例設計的一個很重要的評估標準就是對程式碼的覆蓋度。一說到覆蓋,大家都感覺非常熟悉,但是常見的覆蓋都有哪些?各自有什麼優缺點?在白盒測試的用例設計中我們應該如何自如地運用呢?今天小編就為大家總結了一下幾種常見的覆蓋以及各自的優缺點。  白盒測試中常見的覆蓋有六種:語句

測試基本方法

白盒測試作為測試人員常用的一種測試方法,越來越受到測試工程師的重視。白盒測試並不是簡單的按照程式碼設計用例,而是需要根據不同的測試需求,結合不同的測試物件,使用適合的方法進行測試。因為對於不同複雜度的程式碼邏輯,可以衍生出許多種執行路徑,只有適當的測試方法,才能幫助我們從程

測試中邏輯覆蓋的六種方法

   1.語句覆蓋。這個是起碼要做到的覆蓋了,程式裡的每條可執行的語句都要至少執行一次。這個設計起來比較簡單,用例資料很直觀的就能看出來。但是語句裡的判定,分支等就沒什麼意義了。可以說這樣的測試是最低的要求了。  2.判定覆蓋。每個判斷的真假分支至少執行一次,就是真要至少取一次,假要至少取一次。這個設計起來也

測試---邏輯路徑覆蓋的五種方法和物理路徑覆蓋(一)

一、語句路徑覆蓋:是一個比較弱的邏輯路徑覆蓋標準。是指通過選擇足夠的測試用例,使得執行這些用例時,被測程式的每一個語句至少被執行一次。 舉例:  測試用例  輸入 預期輸出  被測路徑

測試用例設計方法-語句覆蓋法

一、概念 白盒測試技術:一般可以分為靜態分析技術和動態分析技術。 a.靜態分析技術:控制流分析技術、資料流分析技術、資訊流分析技術; b.動態分析技術:邏輯覆蓋率測試、程式插樁; 其中最常用的是邏輯