測(cè)試是傳統(tǒng)軟件開發(fā)的最后一步。整個(gè)軟件開發(fā)過程,需要收集要求、進(jìn)行高層次的設(shè)計(jì)、詳細(xì)設(shè)計(jì)、創(chuàng)建代碼、進(jìn)行部分單元測(cè)試,然后集成,最后才開始最終測(cè)試。
最佳的開發(fā)實(shí)踐應(yīng)包含代碼檢查這個(gè)步驟。然而代碼檢查一般只能找出70%的系統(tǒng)錯(cuò)誤,因此完美的測(cè)試環(huán)節(jié)絕對(duì)必不可少。測(cè)試就像個(gè)復(fù)式記帳系統(tǒng),可以確保將缺陷扼殺在最終推出的產(chǎn)品之前。
在所有其它的工程實(shí)踐中,測(cè)試都被視為基本環(huán)節(jié)。比如,在美國,每一座聯(lián)邦政府出資修建的橋都必須經(jīng)過大量的風(fēng)洞測(cè)試。而在軟件領(lǐng)域,測(cè)試并沒有很受重視。盡管測(cè)試是所有工程實(shí)踐準(zhǔn)則的關(guān)鍵部分,但編寫測(cè)試程序卻感覺是在浪費(fèi)時(shí)間。好在嵌入式系統(tǒng)設(shè)計(jì)界內(nèi)的許多領(lǐng)域已經(jīng)將測(cè)試作為其工作的核心部分,他們認(rèn)識(shí)到將這個(gè)關(guān)鍵步驟放在項(xiàng)目末期極不明智,因而主張同步地編寫測(cè)試程序和應(yīng)用程序。
嵌入式系統(tǒng)軟件測(cè)試在諸多方面都與應(yīng)用軟件測(cè)試一樣。不過,應(yīng)用測(cè)試與嵌入式系統(tǒng)測(cè)試之間還是存在一些重要差異。嵌入式開發(fā)人員一般會(huì)用到基于硬件的測(cè)試工具,而這類工具通常不會(huì)用于應(yīng)用開發(fā)過程中。此外,嵌入式系統(tǒng)一般都有些獨(dú)一無二的特性,這些特性應(yīng)該在測(cè)試計(jì)劃中得以體現(xiàn)。本文將介紹測(cè)試和測(cè)試案例開發(fā)的基礎(chǔ)知識(shí),并指出整個(gè)嵌入式系統(tǒng)測(cè)試工作的特有細(xì)節(jié)。
何時(shí)測(cè)試以及如何測(cè)試
從圖1可以看出,在可行的條件下,測(cè)試應(yīng)盡早展開。一般來講,最早的測(cè)試是由最初的開發(fā)人員進(jìn)行的模塊或單元測(cè)試。遺憾的是,開發(fā)人員大多對(duì)如何建構(gòu)一整套測(cè)試?yán)桃赃M(jìn)行測(cè)試所知不足。由于精心設(shè)計(jì)的測(cè)試?yán)掏ǔV钡郊蓽y(cè)試時(shí)才能使用,因此許多在單元測(cè)試過程中就能找出的缺陷直到集成測(cè)試時(shí)才會(huì)被發(fā)現(xiàn)。比如,硅谷的一家大型網(wǎng)絡(luò)設(shè)備廠商為找出其軟件集成問題的關(guān)鍵原因,進(jìn)行了一項(xiàng)研究。這家廠商發(fā)現(xiàn),在項(xiàng)目集成階段找出的缺陷中,有70%是由在集成之前從沒被執(zhí)行過的程序所產(chǎn)生的。
單元測(cè)試:開發(fā)人員在單獨(dú)進(jìn)行模塊級(jí)測(cè)試時(shí)一般是編寫存根代碼(stub code)取代余下的系統(tǒng)軟硬件。在開發(fā)周期的這個(gè)環(huán)節(jié),測(cè)試主要側(cè)重于代碼的邏輯性能。
通常,開發(fā)人員會(huì)分別使用某些平均值、高值或低值、以及某些超出范圍的值(以測(cè)試代碼的異常處理功能)進(jìn)行測(cè)試。但這些基于“黑匣子”的測(cè)試僅能對(duì)模塊中整個(gè)代碼的一部分進(jìn)行測(cè)試。
回歸測(cè)試:測(cè)試不應(yīng)是一勞永逸的。每次修改程序后都應(yīng)該重新進(jìn)行測(cè)試,以確保這些更改不會(huì)無意中“誤傷”某些不相關(guān)的行為。
稱為回歸測(cè)試的這類測(cè)試,一般是通過測(cè)試腳本自動(dòng)進(jìn)行的。比如,如果你設(shè)計(jì)了一組100個(gè)輸入/輸出(I/O)測(cè)試,回歸測(cè)試腳本會(huì)自動(dòng)執(zhí)行這100個(gè)測(cè)試,然后將輸出與一組“黃金標(biāo)準(zhǔn)”輸出進(jìn)行對(duì)比。每次對(duì)代碼的任何部分進(jìn)行修改時(shí),都要對(duì)包含被修改代碼的整個(gè)程序運(yùn)行整套回歸測(cè)試程序包,以確保修改過程中不會(huì)“誤傷”其余代碼。