單元測(cè)試實(shí)踐的主要問(wèn)題及解決
《單元測(cè)試實(shí)踐的主要問(wèn)題及解決》由會(huì)員分享,可在線閱讀,更多相關(guān)《單元測(cè)試實(shí)踐的主要問(wèn)題及解決(40頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、單元測(cè)試實(shí)踐的主要問(wèn)題與解決 廣州凱樂(lè)軟件技術(shù)有限公司技術(shù)總監(jiān) 王彤 本文是我在“第十屆中國(guó)系統(tǒng)與軟件過(guò)程改進(jìn)年會(huì)廣東會(huì)場(chǎng)”所作演講的整理稿,主要分享單元測(cè)試的一些要點(diǎn)、單元測(cè)試實(shí)踐的主要問(wèn)題,以及如何來(lái)解決這些問(wèn)題。 一、 單元測(cè)試概述 1.1 什么是單元測(cè)試 單元測(cè)試,就是針對(duì)代碼單元的獨(dú)立測(cè)試。為什么需要單元測(cè)試呢?這是代碼的基本特性決定了的。代碼有一個(gè)基本特性,就是對(duì)數(shù)據(jù)分類處理。 代碼通常會(huì)有很多的判定。一個(gè)判定,就是一次分類。嵌套的判定,會(huì)使分類次數(shù)的翻倍。 如果我們?cè)趯?xiě)代碼的時(shí)候,有一個(gè)分類漏掉了,就會(huì)產(chǎn)生一個(gè)Bug;如果一個(gè)分類,雖然寫(xiě)了代碼,但
2、是處理不正確,也會(huì)產(chǎn)生一個(gè)Bug。一個(gè)函數(shù)要沒(méi)有錯(cuò)誤,必須做到兩點(diǎn):1,對(duì)數(shù)據(jù)的分類必須完整;2,每一個(gè)分類的處理必須正確。做到了這兩點(diǎn),就可以說(shuō),代碼的功能邏輯是正確的。 那么,如何檢測(cè)代碼的功能邏輯是否正確呢? 調(diào)試,是臨時(shí)的,且不完整的,例如,一個(gè)函數(shù)有十種輸入,調(diào)試能覆蓋五六種就不錯(cuò)了。而系統(tǒng)測(cè)試,并不針對(duì)某個(gè)具體的函數(shù),不關(guān)注某個(gè)函數(shù)的功能邏輯是否正確。 要檢測(cè)某個(gè)函數(shù)的功能邏輯,就必須要依照分類列出數(shù)據(jù),檢測(cè)代碼是否對(duì)每一個(gè)分類都做了處理,而且每一個(gè)分類的處理是否正確。 ——這就是單元測(cè)試。 1.2 單元測(cè)試的基本方法 由上面的分析可以看出,單元測(cè)試的基本方
3、法就是:依數(shù)據(jù)的分類列出輸入,執(zhí)行被測(cè)試程序,然后,判斷輸出是否符合預(yù)期。 單元測(cè)試能達(dá)到什么樣的效果呢?那就是:無(wú)論別人怎么樣,我總是對(duì)的! 這里的“別人”,是指關(guān)聯(lián)代碼?!拔摇?,是指當(dāng)前正在編寫(xiě)或測(cè)試的代碼。單元測(cè)試要做到的是,無(wú)論關(guān)聯(lián)代碼是否有錯(cuò),都要保證我是對(duì)的。具體來(lái)說(shuō),我要考慮關(guān)聯(lián)代碼會(huì)產(chǎn)生什么樣的數(shù)據(jù),這些數(shù)據(jù)要如何分類處理,只要我的分類和處理是正確的,那么,無(wú)論別人怎么樣,我總是對(duì)的。 1.3 單元測(cè)試的效益 單元測(cè)試的效益可以說(shuō)是立竿見(jiàn)影,并且會(huì)推動(dòng)整個(gè)開(kāi)發(fā)過(guò)程的改進(jìn)。 首先,單元測(cè)試可以保證代碼的質(zhì)量。因?yàn)橹挥袉卧獪y(cè)試,能夠全面檢測(cè)代碼單元的功能邏
4、輯,排除代碼中大量的、細(xì)小的錯(cuò)誤。 其次,排錯(cuò)成本最小。如果在編碼階段同時(shí)進(jìn)行單元測(cè)試,排錯(cuò)成本可以忽略不計(jì)。但若到了后期,排錯(cuò)成本可能會(huì)增長(zhǎng)上百倍,要是產(chǎn)品已經(jīng)到了用戶手里,那造成的損失就更難說(shuō)了。 第三,提升開(kāi)發(fā)效率。單元測(cè)試可以讓程序行為一目了然,也就是程序行為可視化。什么叫程序行為呢?就是什么輸入下,會(huì)執(zhí)行哪些代碼,會(huì)產(chǎn)生什么輸出。如下圖,黑色的代碼是當(dāng)前輸入下所執(zhí)行代碼。 如果我們寫(xiě)幾行代碼,就可以看到程序的行為,相當(dāng)于寫(xiě)文章時(shí)上下文可見(jiàn),這可以促進(jìn)我們的開(kāi)發(fā)思維。如果我們的思維有了偏差,也可以及時(shí)發(fā)現(xiàn)。如果代碼中有了錯(cuò)誤,也可以隨時(shí)排除。 那么,是不是整個(gè)項(xiàng)目的
5、所有代碼都做了單元測(cè)試,才能得到這些效益呢?不是的。80:20規(guī)則,在軟件開(kāi)發(fā)過(guò)程中也存在。也就是說(shuō),80%的代碼錯(cuò)誤,可能存在于20%的代碼中;80%的編碼、調(diào)試成本,可能會(huì)消耗在20%的代碼上。這20%,就是算法密集度高的代碼,也就是功能邏輯復(fù)雜的代碼。 這些代碼可能只有20%,但是卻可能包含了80%的錯(cuò)誤,消耗了80%的編碼、調(diào)試時(shí)間,即使只對(duì)這部分代碼進(jìn)行單元測(cè)試,在提升產(chǎn)品的質(zhì)量和開(kāi)發(fā)效率方面,也會(huì)產(chǎn)生立竿見(jiàn)影的效果。 第四,自動(dòng)回歸。如果沒(méi)有單元測(cè)試,系統(tǒng)測(cè)試發(fā)現(xiàn)了錯(cuò)誤,當(dāng)然要修改代碼,而修改代碼可能引入新的錯(cuò)誤,又要進(jìn)行全面的系統(tǒng)測(cè)試,這樣就可能陷入循環(huán),這通常也是項(xiàng)目延
6、期的主要原因。 如果有了單元測(cè)試,修改代碼時(shí)可以通過(guò)回歸測(cè)試馬上檢測(cè)是否引入了新的錯(cuò)誤。所謂回歸,就是回復(fù)到原來(lái)正確的狀態(tài)。 正是回歸測(cè)試,使單元測(cè)試對(duì)整個(gè)開(kāi)發(fā)過(guò)程的改進(jìn)都產(chǎn)生積極影響,使項(xiàng)目適應(yīng)頻繁變化的需求。單元測(cè)試是敏捷開(kāi)發(fā)的基礎(chǔ)和核心,反過(guò)來(lái)說(shuō),有了單元測(cè)試,開(kāi)發(fā)過(guò)程會(huì)自動(dòng)趨于敏捷。單元測(cè)試也降低了后期測(cè)試的壓力。 二、 單元測(cè)試實(shí)踐的主要問(wèn)題 單元測(cè)試有個(gè)特點(diǎn):測(cè)試簡(jiǎn)單獨(dú)立的代碼很容易,但要在實(shí)際工作中做好單元測(cè)試卻很困難。 根據(jù)我們的經(jīng)驗(yàn),企業(yè)在實(shí)施單元測(cè)試時(shí),通常會(huì)面對(duì)四大問(wèn)題—— l 不愿做:程序員沒(méi)有單元測(cè)試習(xí)慣。 l 沒(méi)時(shí)間:編寫(xiě)測(cè)試代碼需要耗費(fèi)大量的
7、時(shí)間,項(xiàng)目的周期可能不允許。 l 做不了:代碼具有較高的耦合性,使單元測(cè)試難以進(jìn)行。 l 做不好:測(cè)試效果不能令人滿意。我們通常會(huì)以覆蓋率來(lái)衡量測(cè)試效果,但要實(shí)現(xiàn)高標(biāo)準(zhǔn)的測(cè)試覆蓋很困難。 三、 解決思路和方法 如何解決上述問(wèn)題呢?接下來(lái),談?wù)勔恍┧悸泛头椒ǎ褂玫墓ぞ呤荲isual Unit。Visual Unit,簡(jiǎn)稱VU,是可視化的C/C++單元測(cè)試工具。 3.1 如何解決“不愿做”和“沒(méi)時(shí)間” 對(duì)于“不愿做”,我們采用的對(duì)策是可視化,這個(gè)可視化,是指程序行為可視,后面我會(huì)用案例來(lái)演示;對(duì)于“沒(méi)時(shí)間”,采用的對(duì)策是自動(dòng)化,通過(guò)自動(dòng)生成測(cè)試代碼、自動(dòng)打樁等功能,讓測(cè)試的時(shí)
8、間成本最小化。這兩者結(jié)合起來(lái),就是ETDD開(kāi)發(fā)模式。 那么,ETDD是什么呢? 首先來(lái)介紹一下TDD,TDD就是測(cè)試驅(qū)動(dòng)開(kāi)發(fā),這個(gè)大家可能聽(tīng)得比較多了。ETDD就是Easy TDD,即:易行版的TDD。ETDD具有以下一些特點(diǎn): l 可視化,在開(kāi)發(fā)過(guò)程中,程序行為可視。 l 自動(dòng)化,除了測(cè)試數(shù)據(jù)需要人工設(shè)定外,其他基本上都自動(dòng)完成。 l 現(xiàn)實(shí)化,不一定要測(cè)試所有代碼,在開(kāi)始階段,可以只測(cè)試功能邏輯復(fù)雜的20%代碼。 下面,我用一個(gè)案例,講解一下ETDD的過(guò)程: 假如我要編寫(xiě)一個(gè)函數(shù),它的功能是刪除字符串左邊的空格。 先寫(xiě)好函數(shù)的框架,能通過(guò)編譯就行。在編寫(xiě)代碼前,程序員必須要做
9、的一件事情,是想清楚代碼的功能。如果我們想的時(shí)候,順手把它記錄下來(lái),就可以讓代碼的功能更清晰、更明確。 我們現(xiàn)在來(lái)記錄代碼的功能。這里的記錄,不是文字形式的寵統(tǒng)說(shuō)明,而是數(shù)據(jù)形式的精確定義,也就是用輸入和輸出的方式來(lái)記錄。 首先,記錄最基本的功能,也就是最基本、最常見(jiàn)的輸入和輸出。輸入一個(gè)左邊有空格的字符串,輸出是刪除左邊空格后的字符串,返回值跟參數(shù)的輸出是一樣的。 然后,記錄詳細(xì)的功能。例如,左邊沒(méi)有空格的,全是空格的,還有空字符串。 把每種輸入的正確輸出也記錄一下。完成了這個(gè)工作后,代碼的功能就完全定義下來(lái)了。 現(xiàn)在,我們開(kāi)始編寫(xiě)代碼。我的編碼思路是這樣的:分為兩
10、步,第一步計(jì)算左邊的空格數(shù)量;第二步,將非空格的字符向左移動(dòng),覆蓋掉左邊的空格。 以下幾行代碼,計(jì)算左邊的空格,現(xiàn)在編譯一下。CTRL+F7。如果編譯通過(guò),測(cè)試就會(huì)自動(dòng)運(yùn)行。 我們可以看到,輸入是什么,執(zhí)行了哪些代碼,產(chǎn)生了什么輸出。這里,黑色的是當(dāng)前輸入下所執(zhí)行的代碼,未執(zhí)行的話會(huì)顯示為紅色。這里全是黑色,表示當(dāng)前輸入下執(zhí)行了全部代碼。如果我們想看一下計(jì)算左邊空格的結(jié)果對(duì)不對(duì),這是內(nèi)部的數(shù)據(jù),要指定位置后才會(huì)打印出來(lái)。按ESC鍵回到開(kāi)發(fā)環(huán)境。 用這種語(yǔ)法可以輸出內(nèi)部數(shù)據(jù),適合于程序員開(kāi)發(fā)過(guò)程中使用。復(fù)雜類型也可以用同樣的語(yǔ)法輸出。 另一種輸出內(nèi)部數(shù)據(jù)的語(yǔ)法是,在左邊的
11、代碼窗口,在要輸出的位置點(diǎn)擊一下,右鍵菜單選擇“輸出內(nèi)部數(shù)據(jù)”,這樣填一下就行了。這種方式不會(huì)修改產(chǎn)品代碼,適合于測(cè)試員使用。 再次執(zhí)行后,可以看到,左邊的空格的數(shù)量是4,這是對(duì)的,那我們可以繼續(xù)編寫(xiě)。 新加的這幾行代碼完成字符串的移動(dòng)。這樣,代碼基本上寫(xiě)完了,結(jié)果對(duì)不對(duì)呢?CTRL+F7編譯一下。 結(jié)果是完全不對(duì)的。我們來(lái)分析一下,輸入是這個(gè),全部代碼都是黑色,表示都執(zhí)行到了,跟我設(shè)想的一樣。問(wèn)題在哪里呢? 看一下計(jì)算左邊空格的代碼,經(jīng)過(guò)計(jì)算后,指針偏移了,所以后面的計(jì)算,使用的是不正確的指針。 我們把指針先保存一下,第二次計(jì)算前再恢復(fù)回來(lái)。看看結(jié)果怎么樣。
12、現(xiàn)在,參數(shù)的輸出是正確的了。但是,返回值還是不對(duì),返回值應(yīng)該跟參數(shù)一樣。分析一下,經(jīng)過(guò)這里的計(jì)算后,指針再次偏移了,返回前沒(méi)有恢復(fù),所以,返回的是不正確的指針。 返回前,再次把指針恢復(fù)。看看結(jié)果。 現(xiàn)在,結(jié)果是正確的了??匆幌聹y(cè)試結(jié)果,還有一個(gè)異常。 點(diǎn)擊它,可以看到,是空指針產(chǎn)生了這個(gè)異常,我們的代碼沒(méi)有對(duì)空指針進(jìn)行處理。在這里,可以很清晰的看到代碼的執(zhí)行狀況。前面三行是黑色的,第四行開(kāi)始都是紅色的,表示代碼只執(zhí)行到第三行,也就是說(shuō),第三行產(chǎn)生了異常。 添加處理空指針的代碼。 現(xiàn)在,代碼寫(xiě)完了,單元測(cè)試也同步完成了。 我們來(lái)回顧一下ETDD過(guò)程:跟傳統(tǒng)
13、開(kāi)發(fā)模式相比,ETDD多付出的,是把以前僅在頭腦里想的代碼功能記錄下來(lái),從而精確地、完整地進(jìn)行代碼的功能設(shè)計(jì)。 ETDD所得到的,是在編寫(xiě)代碼的過(guò)程中,隨時(shí)可以看到代碼的行為,這可以讓我們的編碼過(guò)程變得輕松,而且也基本上不用調(diào)試,大家知道,調(diào)試,是最花費(fèi)時(shí)間的。 另一方面,只要這里設(shè)定的數(shù)據(jù)是完整的,那么,我們的代碼就沒(méi)有問(wèn)題。將來(lái),如果需要修改代碼,只要重新執(zhí)行一下測(cè)試,就可以知道是不是破壞了原有的功能。 小結(jié):ETDD通過(guò)可視化來(lái)幫助程序員輕松地編寫(xiě)程序,單元測(cè)試不再是一個(gè)負(fù)擔(dān);ETDD通過(guò)自動(dòng)化,使程序員只需要在考慮代碼功能時(shí)順手記錄一下,其他工作都由工具完成。ET
14、DD提升了編碼的效率,也省略大部分調(diào)試,從而大幅提升了生產(chǎn)力。 3.2 如何解決“做不了” 上面我們只是用一個(gè)獨(dú)立的函數(shù)來(lái)演示ETDD過(guò)程。在實(shí)際的工作中,代碼之間通常是互相依賴的,這種依賴關(guān)系會(huì)造成測(cè)試難于進(jìn)行,這就是“做不了”的問(wèn)題。 我們首先來(lái)分析一下?!白霾涣恕敝饕侵缚蓽y(cè)性問(wèn)題??蓽y(cè)性問(wèn)題的核心是內(nèi)部輸入。在解釋內(nèi)部輸入前,我們先來(lái)看一下一般的輸入:外部輸入。 外部輸入是指在被測(cè)代碼的外部可以設(shè)定的輸入,包括參數(shù)、成員變量、全局變量。外部輸入一般可以直接設(shè)定。 單元測(cè)試的核心難點(diǎn)在于內(nèi)部輸入,什么是內(nèi)部輸入呢? 像下面這個(gè)例子,這兩個(gè)數(shù)據(jù),都是在被測(cè)試代碼
15、的內(nèi)部,通過(guò)調(diào)用關(guān)聯(lián)代碼來(lái)取得,也就是內(nèi)部取得的數(shù)據(jù)。對(duì)于內(nèi)部取得的數(shù)據(jù),代碼要如何處理呢?跟參數(shù)一樣,也是分類處理。因此,測(cè)試時(shí)也要分類檢測(cè),這就是內(nèi)部輸入。 內(nèi)部輸入有六種情形,我們利用工具都可以處理。 解決內(nèi)部輸入的主要方法有打樁、模擬對(duì)象、底層模擬。 先來(lái)介紹打樁。樁就是代替真實(shí)代碼的一些代碼。樁的功能主要有隔離、補(bǔ)齊和控制??梢酝ㄟ^(guò)編寫(xiě)樁代碼,來(lái)解決內(nèi)部輸入問(wèn)題。這是樁的控制功能。 用打樁來(lái)解決內(nèi)部輸入,有一些問(wèn)題:一是編寫(xiě)樁代碼增加了工作量;二是內(nèi)部輸入和外部輸入分離,難于管理;三是只能解決部分內(nèi)部輸入問(wèn)題。例如,要在一個(gè)用例中多次調(diào)用同一關(guān)聯(lián)函數(shù),要求每次輸出
16、不同,樁代碼就很難做到。 解決內(nèi)部輸入的另一個(gè)方法是模擬對(duì)象,這個(gè)比較復(fù)雜,另外,對(duì)于C和C++也不太適用。我們可以采用底層模擬來(lái)解決內(nèi)部輸入問(wèn)題。 底層模擬有三個(gè)特點(diǎn):一是內(nèi)部輸入與外部輸入一起管理;二是不需要考慮關(guān)聯(lián)代碼的狀態(tài),無(wú)所關(guān)聯(lián)代碼是否存在,是否隔離,都可以直接使用;三是不需要編寫(xiě)代碼。 下面我也用一個(gè)案例來(lái)講解一下底層模擬。這個(gè)示例,是一個(gè)空調(diào)控制程序。 代碼的功能,是首先取得環(huán)境的溫度,然后與預(yù)設(shè)的目標(biāo)溫度比較,計(jì)算出溫度差,溫度每差一度,制冷器運(yùn)行60秒。 首先,我們?cè)O(shè)定外部數(shù)據(jù)。假設(shè),預(yù)設(shè)的目標(biāo)溫度是25度,是這個(gè)全局變量,設(shè)為25。返回值為1,表示操作成
17、功。假設(shè)環(huán)境溫度是28度,那么,制冷器應(yīng)該運(yùn)行180秒,這里填180。然后執(zhí)行測(cè)試。 由于環(huán)境溫度還沒(méi)有設(shè)定,測(cè)試進(jìn)行不下去。環(huán)境溫度由這個(gè)函數(shù)來(lái)取得。即使這個(gè)函數(shù)可以正常工作,取到的環(huán)境溫度也不可能滿足我們的測(cè)試需求。我們可以用底層模擬來(lái)解決。 首先,我們要讓這個(gè)取溫度的函數(shù)返回1,表示取溫度成功。雙擊函數(shù)名。 模擬值填1。 然后,設(shè)定環(huán)境的溫度。雙擊這個(gè)表示環(huán)境溫度的參數(shù)。 模擬值填28。 再看測(cè)試結(jié)果?,F(xiàn)在測(cè)試就可以正常進(jìn)行了。這個(gè)參數(shù)的輸出是180,跟我們預(yù)期的一樣。內(nèi)部輸入這里,顯示了兩個(gè)內(nèi)部輸入。 這是我們?cè)O(shè)定的內(nèi)部輸入,和外部輸入可以一起
18、管理。我們也可以把它移到表格中。 在表格中,我們?cè)黾右粋€(gè)用例,把溫度設(shè)為30,直接設(shè)定就是了。 這是環(huán)境溫度為30度時(shí)的測(cè)試結(jié)果,制冷器的運(yùn)行時(shí)間為300。 上面演示的是簡(jiǎn)單類型的底層模擬,復(fù)雜類型也一樣可以模擬,下面我演示一下。 這個(gè)底層函數(shù)返回的是一個(gè)對(duì)象指針,如何模擬呢?雙擊函數(shù)名,打開(kāi)底層模擬器。 首先,在前置代碼中定義對(duì)象并初始化。然后,在模擬值中填寫(xiě)這個(gè)對(duì)象的地址。 這是模擬的結(jié)果。 復(fù)雜對(duì)象的數(shù)據(jù)一樣可以移到表格中,這時(shí),要移到表格中的不是對(duì)象本身,而是對(duì)象中包含的數(shù)據(jù)。例如,要把data.ui移到表格中,雙擊它的值“1234”就行了。
19、 我們還可以用局部數(shù)據(jù)模擬的功能,處理各種各樣的復(fù)雜情形。 例如,以下函數(shù)處理的是由界面輸入的數(shù)據(jù),這也是單元測(cè)試的一個(gè)難點(diǎn)??梢允褂镁肿償?shù)據(jù)模擬,把界面輸入轉(zhuǎn)換成普通的內(nèi)部輸入。 這個(gè)函數(shù)的邏輯功能是計(jì)算SQL字符串,但計(jì)算結(jié)果沒(méi)有輸出到外部,這是內(nèi)部輸出,工具也可以判斷內(nèi)部輸出是否正確。 下圖是測(cè)試結(jié)果: 內(nèi)部輸入解決之后,無(wú)論別人(關(guān)聯(lián)代碼),是否存在,是否正確,是否被隔離,都可以完整檢測(cè)我(當(dāng)前代碼)。檢測(cè)我是否對(duì)所有數(shù)據(jù),包括內(nèi)部輸入,都做了正確的分類和處理。 從而實(shí)現(xiàn)單元測(cè)試的目標(biāo):無(wú)論別人怎么樣,我總是對(duì)的! 如果所有代碼單元都做到了這一點(diǎn),那會(huì)怎么
20、樣呢?整個(gè)項(xiàng)目就沒(méi)有代碼錯(cuò)誤。 來(lái)看看嵌入式測(cè)試。在設(shè)備上進(jìn)行單元測(cè)試不僅難度大、成本高,也無(wú)法達(dá)到應(yīng)有的效果。如果在設(shè)備上測(cè)試,設(shè)備的一些輸出是難于控制的,例如這個(gè)例子,假設(shè)只有在發(fā)生雷擊時(shí),獲取前車(chē)距離的函數(shù)才會(huì)返回失敗,那我們是不是等著雷擊呢? 即使不考慮成本,嵌入式單元測(cè)試也應(yīng)該在PC上進(jìn)行,這樣才能做到“我總是對(duì)的”。 3.3 如何解決“做不好” 現(xiàn)在來(lái)看做不好的問(wèn)題。做不好的主要原因,是高標(biāo)準(zhǔn)的測(cè)試覆蓋難以實(shí)現(xiàn)。 為什么要關(guān)注測(cè)試覆蓋呢?因?yàn)槲锤采w的單位,通常對(duì)應(yīng)未測(cè)試的數(shù)據(jù)分類,也就是說(shuō),可以用覆蓋率來(lái)檢查測(cè)試的完整性,衡量測(cè)試效果。 應(yīng)該在完成功能測(cè)試的
21、基礎(chǔ)上,統(tǒng)計(jì)覆蓋率,找出遺漏用例來(lái)完成白盒覆蓋,而不是功能測(cè)試做一遍,白盒覆蓋又做一遍。 下面,我用一個(gè)案例來(lái)演示講解覆蓋。 首先是覆蓋率統(tǒng)計(jì),工具可以支持六種覆蓋:語(yǔ)句、條件、分支、C/DC(判定條件覆蓋)、路徑覆蓋、MC/DC(修正判定條件覆蓋)。 哪些單位沒(méi)覆蓋呢?這個(gè)紅色且?guī)Уt色背景的,是未覆蓋語(yǔ)句;這個(gè)T是未覆蓋的條件真值;這個(gè)F是未覆蓋的條件假值;這個(gè)M是未覆蓋的MC/DC。 淡紅色背景的分支是未覆蓋分支,淡綠色背景的是已覆蓋分支。路徑是從入口到出口的路線,這條用綠色畫(huà)出的是已覆蓋的路徑。 這條用紅色畫(huà)出的是未覆蓋路徑。 如何完成覆蓋呢?點(diǎn)擊未覆蓋的單
22、位,比如這個(gè)T,右鍵菜單選擇“用例設(shè)計(jì)”。 工具會(huì)自動(dòng)計(jì)算出一個(gè)近似用例,所謂近似用例,就是經(jīng)過(guò)最小修改就可以覆蓋選中單位的用例。 如何修改呢?工具提供了修改提示,按這個(gè)藍(lán)色粗體的提示修改就可以了。這里的提示是A >1,把它改為大于1的數(shù),如2。在實(shí)際工作中,輸出也要根據(jù)功能進(jìn)行修改,這里忽略。 執(zhí)行測(cè)試后,可以看到剛才那個(gè)T已經(jīng)覆蓋了。點(diǎn)擊F,打開(kāi)用例設(shè)計(jì)器。 這里的提示是B不等于0,把B改為不等于0,比如1。 現(xiàn)在來(lái)覆蓋這個(gè)T。 把X改為大于1的數(shù),如2。 現(xiàn)在,代碼這邊已經(jīng)完成全部覆蓋了,看一下覆蓋率,還有一條路徑未覆蓋。 在這里選擇未覆蓋的路徑,打開(kāi)用列設(shè)計(jì)器。 提示是:A不等于2,X小于等于1,X本來(lái)就小于1,不用改它,把A改為不等于2的數(shù)就行了,如3。 現(xiàn)在,完成了全部覆蓋。 總結(jié) 我們用可視化來(lái)解決“不愿做”,用自動(dòng)化來(lái)解決“沒(méi)時(shí)間”,這兩者結(jié)合起來(lái),就是ETDD開(kāi)發(fā)模式。 造成做不了的主要原因是代碼的耦合關(guān)系形成的內(nèi)部輸入問(wèn)題,我們用底層模擬來(lái)解決內(nèi)部輸入,真正可以做到“無(wú)論別人怎么樣,我總是對(duì)的”。 在覆蓋方面,我們利用工具不僅統(tǒng)計(jì)覆蓋率,清晰標(biāo)示未覆蓋單位,而且,用例設(shè)計(jì)器可以幫助我們快速找出遺漏用例,實(shí)現(xiàn)高覆蓋,解決做不好的問(wèn)題。 40 / 40文檔可自由編輯打印
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書(shū)
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語(yǔ)文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告