當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]嵌入式系統(tǒng)軟件測試及測試案例開發(fā)

測試是傳統(tǒng)軟件開發(fā)的最后一步。整個(gè)軟件開發(fā)過程,需要收集要求、進(jìn)行高層次的設(shè)計(jì)、詳細(xì)設(shè)計(jì)、創(chuàng)建代碼、進(jìn)行部分單元測試,然后集成,最后才開始最終測試。

最佳的開發(fā)實(shí)踐應(yīng)包含代碼檢查這個(gè)步驟。然而代碼檢查一般只能找出70%的系統(tǒng)錯(cuò)誤,因此完美的測試環(huán)節(jié)絕對必不可少。測試就像個(gè)復(fù)式記帳系統(tǒng),可以確保將缺陷扼殺在最終推出的產(chǎn)品之前。

在所有其它的工程實(shí)踐中,測試都被視為基本環(huán)節(jié)。比如,在美國,每一座聯(lián)邦政府出資修建的橋都必須經(jīng)過大量的風(fēng)洞測試。而在軟件領(lǐng)域,測試并沒有很受重視。盡管測試是所有工程實(shí)踐準(zhǔn)則的關(guān)鍵部分,但編寫測試程序卻感覺是在浪費(fèi)時(shí)間。好在嵌入式系統(tǒng)設(shè)計(jì)界內(nèi)的許多領(lǐng)域已經(jīng)將測試作為其工作的核心部分,他們認(rèn)識到將這個(gè)關(guān)鍵步驟放在項(xiàng)目末期極不明智,因而主張同步地編寫測試程序和應(yīng)用程序。

嵌入式系統(tǒng)軟件測試在諸多方面都與應(yīng)用軟件測試一樣。不過,應(yīng)用測試與嵌入式系統(tǒng)測試之間還是存在一些重要差異。嵌入式開發(fā)人員一般會(huì)用到基于硬件的測試工具,而這類工具通常不會(huì)用于應(yīng)用開發(fā)過程中。此外,嵌入式系統(tǒng)一般都有些獨(dú)一無二的特性,這些特性應(yīng)該在測試計(jì)劃中得以體現(xiàn)。本文將介紹測試和測試案例開發(fā)的基礎(chǔ)知識,并指出整個(gè)嵌入式系統(tǒng)測試工作的特有細(xì)節(jié)。

何時(shí)測試以及如何測試

從圖1可以看出,在可行的條件下,測試應(yīng)盡早展開。一般來講,最早的測試是由最初的開發(fā)人員進(jìn)行的模塊或單元測試。遺憾的是,開發(fā)人員大多對如何建構(gòu)一整套測試?yán)桃赃M(jìn)行測試所知不足。由于精心設(shè)計(jì)的測試?yán)掏ǔV钡郊蓽y試時(shí)才能使用,因此許多在單元測試過程中就能找出的缺陷直到集成測試時(shí)才會(huì)被發(fā)現(xiàn)。比如,硅谷的一家大型網(wǎng)絡(luò)設(shè)備廠商為找出其軟件集成問題的關(guān)鍵原因,進(jìn)行了一項(xiàng)研究。這家廠商發(fā)現(xiàn),在項(xiàng)目集成階段找出的缺陷中,有70%是由在集成之前從沒被執(zhí)行過的程序所產(chǎn)生的。

 

 

圖1:改正問題的成本。

單元測試:開發(fā)人員在單獨(dú)進(jìn)行模塊級測試時(shí)一般是編寫存根代碼(stub code)取代余下的系統(tǒng)軟硬件。在開發(fā)周期的這個(gè)環(huán)節(jié),測試主要側(cè)重于代碼的邏輯性能。

通常,開發(fā)人員會(huì)分別使用某些平均值、高值或低值、以及某些超出范圍的值(以測試代碼的異常處理功能)進(jìn)行測試。但這些基于“黑匣子”的測試僅能對模塊中整個(gè)代碼的一部分進(jìn)行測試。

回歸測試:測試不應(yīng)是一勞永逸的。每次修改程序后都應(yīng)該重新進(jìn)行測試,以確保這些更改不會(huì)無意中“誤傷”某些不相關(guān)的行為。

稱為回歸測試的這類測試,一般是通過測試腳本自動(dòng)進(jìn)行的。比如,如果你設(shè)計(jì)了一組100個(gè)輸入/輸出(I/O)測試,回歸測試腳本會(huì)自動(dòng)執(zhí)行這100個(gè)測試,然后將輸出與一組“黃金標(biāo)準(zhǔn)”輸出進(jìn)行對比。每次對代碼的任何部分進(jìn)行修改時(shí),都要對包含被修改代碼的整個(gè)程序運(yùn)行整套回歸測試程序包,以確保修改過程中不會(huì)“誤傷”其余代碼。

測試什么

因?yàn)闆]有一個(gè)實(shí)際的測試集可以證明一個(gè)程序是正確的,因此關(guān)鍵問題變成了哪個(gè)測試子集最有可能檢測到最多的錯(cuò)誤。選擇合適的測試?yán)痰膯栴}被稱為測試?yán)淘O(shè)計(jì)。雖然存在數(shù)十種測試案例的設(shè)計(jì)方法,但它們通常可歸為兩種截然不同的方法:功能測試和覆蓋測試。

功能測試(也稱為黑匣子測試)選擇可評估實(shí)現(xiàn)與需求規(guī)格符合程度的測試。覆蓋測試(也稱為白匣子測試)選擇可執(zhí)行代碼某些部分的測試?yán)獭?過后,將詳細(xì)討論這兩種方法。)

這兩種測試都是對嵌入式設(shè)計(jì)進(jìn)行嚴(yán)格測試所必需的。其中,覆蓋測試表示代碼的穩(wěn)定性,所以這種測試是用于已經(jīng)完成或?qū)⒔瓿傻漠a(chǎn)品的。另一方面,可在編寫要求文檔時(shí),同時(shí)編寫功能測試。

事實(shí)上,從功能測試開始入手,可以最大限度地降低重復(fù)勞動(dòng)和重寫測試案例的工作。因此,在我看來,要先考慮功能測試。

每個(gè)人都同意先編寫功能測試這個(gè)觀點(diǎn),有人認(rèn)為,功能測試在系統(tǒng)集成階段(而不是在單元測試時(shí))最有用。以下是整合功能測試和覆蓋測試方法的一個(gè)簡單處理流程:

找出哪些功能未被功能測試完全覆蓋。

找出每個(gè)功能的哪些部分沒被執(zhí)行。

找出需要哪些額外的覆蓋測試。

運(yùn)行新增的額外測試。

重復(fù)以上步驟。

何時(shí)停止測試?

最通用的停止標(biāo)準(zhǔn)(按可靠性排序)如下:

老板命令停止測試

新的測試周期找到的新缺陷少于X個(gè)

在沒有發(fā)現(xiàn)任何新缺陷的情況下已經(jīng)滿足了某個(gè)覆蓋閥限

無論你多么徹底地測試了程序,都無法保證找出所有缺陷。這引發(fā)了另一個(gè)有趣的問題:你可容忍多少缺陷?假設(shè)在極端軟件壓力測試過程中,你發(fā)現(xiàn)系統(tǒng)每進(jìn)行大約20小時(shí)的測試就會(huì)鎖定。你仔細(xì)地檢查程序,但是仍無法找出這個(gè)錯(cuò)誤的根源。這個(gè)時(shí)候你應(yīng)該交付產(chǎn)品嗎?

多少測試才“足夠好”?這個(gè)我說不好。但遵循一些久經(jīng)時(shí)間考驗(yàn)的規(guī)則總是好的:“如果方法Z預(yù)估Y行代碼中的缺陷少于X個(gè),那么就可放心地發(fā)布程序了。”也許有一天會(huì)出現(xiàn)這種標(biāo)準(zhǔn)。編程行業(yè)仍然相對年輕,還達(dá)不到類似建筑業(yè)那樣的成熟度。

許多厚厚的建筑手冊和大本規(guī)范是多年經(jīng)驗(yàn)的結(jié)晶,它們可為建筑師、土木工程師和結(jié)構(gòu)工程師提供按工期在預(yù)算內(nèi)、建造一棟安全建筑所需的全部信息。偶爾雖仍會(huì)有建筑倒塌,但畢竟很少見。在編程行業(yè)制定出類似標(biāo)準(zhǔn)前,“多少測試才足夠?”就是個(gè)主觀判斷問題。

選擇測試案例

在理想情況下,你可能想要測試程序中每一個(gè)可能的行為。這意味著每一種可能的輸入組合或者每一種可能的判定路徑至少測試一次。

這是個(gè)崇高但完全不切實(shí)際的目標(biāo)。比如,Glen Ford Myers在其《軟件測試的藝術(shù)》一書中就描述了一個(gè)只用五個(gè)判定條件就可有1014個(gè)不同執(zhí)行路徑的小程序。他指出,如果你能夠每五分鐘就能編寫、執(zhí)行并驗(yàn)證一個(gè)測試?yán)痰脑?,那么全面徹底地測試完這個(gè)小程序需要10億年時(shí)間。

顯然,理想的狀況是無法實(shí)現(xiàn)的,因此你必須采用接近這種理想狀況的標(biāo)準(zhǔn)。如你所見,功能測試與覆蓋測試相結(jié)合可以提供合理的次優(yōu)選擇方案?;痉椒ㄊ沁x擇最有可能發(fā)現(xiàn)錯(cuò)誤的測試(一部分功能測試,一部分覆蓋測試)。

1.功能測試

功能測試一般稱為黑匣子測試,因?yàn)樵诰帉懝δ軠y試的測試?yán)虝r(shí)并沒有涉及實(shí)際的代碼。換句話說,沒有觸及到“匣子內(nèi)”。嵌入式系統(tǒng)有輸入和輸出,并在輸入和輸出之間執(zhí)行某些算法。黑匣子測試是根據(jù)對哪些輸入應(yīng)該是可接受的以及這些輸入應(yīng)與輸出有何種關(guān)系的了解來進(jìn)行的。黑匣子測試完全不了解輸入與輸出之間的算法是如何實(shí)現(xiàn)的。黑匣子測試的示例包括:

壓力測試:有意使輸入通道、內(nèi)存緩沖器、磁盤控制器、存儲器管理系統(tǒng)等過載的測試

邊界值測試:表示特定范圍內(nèi)的“邊界”的輸入(例如,對于整數(shù)輸入而言,是最大和最小整數(shù)以及-1、0、+1);以及應(yīng)使輸出在輸出范圍的類似邊界出現(xiàn)跨變的輸入值。

異常測試:能觸發(fā)故障模式或異常模式的測試。

錯(cuò)誤推測:根據(jù)以前的軟件測試經(jīng)驗(yàn)或者從測試類似程序獲得的經(jīng)驗(yàn)進(jìn)行的測試。

隨機(jī)測試:通常,這是效率最低的一種測試方法,但卻仍然廣泛用于評估用戶界面代碼的魯棒性。

性能測試:由于性能預(yù)期是產(chǎn)品要求的一部分,因此性能分析屬于功能測試的范疇。

由于黑匣子測試僅取決于程序要求及其I/O行為,因此一旦完成功能要求的編寫,即可開發(fā)這類測試。這使得黑匣子測試?yán)痰拈_發(fā)可以與余下的系統(tǒng)設(shè)計(jì)同步進(jìn)行。

與所有測試一樣,功能測試應(yīng)被設(shè)計(jì)得具有破壞性,也即,要試圖證明程序無法工作。這包括使輸入通道過載、隨意地敲打鍵盤,以及故意地做程序員認(rèn)為會(huì)破壞其程序的所有事情。

作為研發(fā)產(chǎn)品經(jīng)理,這是我的主要測試方法之一。如果產(chǎn)品在經(jīng)過40個(gè)小時(shí)的極限測試(abuse testing)后,并沒發(fā)現(xiàn)任何嚴(yán)重或者致命的缺陷,那么就可以發(fā)布這個(gè)產(chǎn)品了。如果找到了一個(gè)重大的缺陷,那么修正這個(gè)缺陷后,還必須重復(fù)前面的測試步驟。

2.覆蓋測試

功能測試的缺點(diǎn)是其很少執(zhí)行全部代碼。覆蓋測試則試圖規(guī)避這個(gè)缺點(diǎn),它采用的方法是(理想地)確保每一條代碼語句、判定點(diǎn)或者判定路徑都至少被測試一次。覆蓋測試還可以顯示已經(jīng)訪問的數(shù)據(jù)空間大小。

覆蓋測試也稱為白匣子測試或玻璃匣子測試,這類測試的設(shè)計(jì)需要全面了解軟件的實(shí)現(xiàn)方式,也就是說,它要“看到匣子里面”。白匣子測試?yán)昧嗽创a所能提供的方便。

白匣子測試充分借力了程序員對程序API、內(nèi)部控制結(jié)構(gòu)的知識,分享了程序員的異常處理能力。由于白匣子測試取決于具體的實(shí)現(xiàn)決策,因此要到應(yīng)用代碼完成后,才能動(dòng)手設(shè)計(jì)這類測試。

嵌入式系統(tǒng)的角度來看,覆蓋測試是最重要的測試,這是因?yàn)橹灰惆盐找言诙啻蟪潭壬蠈Υa進(jìn)行了測試,你就可很好地預(yù)警出現(xiàn)未發(fā)現(xiàn)缺陷的風(fēng)險(xiǎn)。白匣子測試的示例包括:

語句覆蓋:選擇的測試案例可以至少將程序中的每一條語句執(zhí)行一次。

判定或分支覆蓋:選擇的測試?yán)炭梢允姑恳粋€(gè)分支(條件為真和假的路徑)至少執(zhí)行一次。

條件覆蓋:選擇的測試?yán)炭梢詮?qiáng)制判定中的每一個(gè)條件(項(xiàng))都包含所有可能的邏輯值。

理論上,白匣子測試可以利用或控制所需的任何對象來執(zhí)行其測試。因此,白匣子測試可能使用JTAG接口強(qiáng)制設(shè)定特定的存儲器值作為測試的一部分。實(shí)踐上,白匣子測試可以分析邏輯分析儀報(bào)告的執(zhí)行路徑。

3.灰匣子測試

由于白匣子測試可以深入代碼內(nèi)部,因此與黑匣子測試相比,這類測試的維護(hù)成本更高。只要要求和I/O關(guān)系保持穩(wěn)定,黑匣子測試就會(huì)一直有效;但每次修改代碼后,可能都需要重新進(jìn)行白匣子測試。因此成本效益最高的白匣子測試一般是那些在不深入編程細(xì)節(jié)的情況下利用實(shí)現(xiàn)知識進(jìn)行的測試。

較少涉及代碼細(xì)節(jié)的測試有時(shí)也稱為灰匣子測試。當(dāng)與“錯(cuò)誤推測”配合使用時(shí),灰匣子測試非常有效。如果你知道(或者至少猜到)代碼中的弱點(diǎn)在哪里,那么你就可以設(shè)計(jì)出對這些弱點(diǎn)“施壓”的測試案例。

因?yàn)檫@些測試覆蓋了代碼的特定部分,因此這些測試是灰匣子測試;因?yàn)檫@些測試是根據(jù)可能會(huì)出現(xiàn)哪些錯(cuò)誤的猜測而選擇的,因此這些測試是錯(cuò)誤推測測試。

在整合新功能與穩(wěn)定的舊代碼庫時(shí),這種測試策略非常有用。由于代碼庫已經(jīng)過全面的測試,因此將測試重點(diǎn)集中在新、舊代碼交集處可以起到事半功倍的效果。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉