新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 淺談嵌入式軟件測試

淺談嵌入式軟件測試

作者: 時間:2012-12-31 來源:網(wǎng)絡(luò) 收藏

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

本文引用地址:http://m.butianyuan.cn/article/148161.htm

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

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

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

何時測試以及如何測試

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

1.jpg

圖1:改正問題的成本。

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

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

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

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

測試什么

因為沒有一個實際的測試集可以證明一個程序是正確的,因此關(guān)鍵問題變成了哪個測試子集最有可能檢測到最多的錯誤。選擇合適的測試例程的問題被稱為測試例程設(shè)計。雖然存在數(shù)十種測試案例的設(shè)計方法,但它們通??蓺w為兩種截然不同的方法:功能測試和覆蓋測試。

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

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

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

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

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

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

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

4.運行新增的額外測試。

5.重復(fù)以上步驟。

何時停止測試?

最通用的停止標準(按可靠性排序)如下:

1.老板命令停止測試

2.新的測試周期找到的新缺陷少于X個

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

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

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

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

選擇測試案例

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

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

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

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 下一頁

關(guān)鍵詞: 軟件測試 嵌入式

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉