功能測試涉及了軟件在功能上正反兩面的測試,而非功能測試就是所有其他方面的測試。非功能測試包括性能、負載、安全、可靠性和其他很多方面。非功能測試有時也被稱作行為測試或質(zhì)量測試。非功能測試的眾多屬性的一個普遍特征是一般不能直接測量。這些屬性是被間接地測量,例如用失敗率來衡量可靠性或圈復(fù)雜度,用設(shè)計審議指標(biāo)來評估可測性。
國際標(biāo)準(zhǔn)化組織(ISO)在ISO 9216和ISO 25000:2005中定義了幾個非功能屬性。這些屬性包括:
可靠性
軟件使用者期望軟件能夠無誤運行。可靠性是度量軟件如何在主流情形和非預(yù)期情形下維持它的功能,有時也包括軟件出錯時的自恢復(fù)能力。例如,自動定時保存現(xiàn)行文件的功能就可以歸類到可靠性。
可用性
如果用戶不明白應(yīng)該如何使用,那么,即使是零差錯的軟件也會變得毫無用處。可用性測量的是用戶
學(xué)習(xí)和控制軟件以達到用戶需求的容易程度。進行可用性研究、重視顧客反饋意見和對錯誤信息和交互內(nèi)容的檢查都能提高可用性。
可維護性
可維護性描述了修改軟件而不引入新錯誤所需的
工作量。產(chǎn)品代碼和測試代碼都必須具備高度的可維護性。團隊成員對代碼的熟悉程度、產(chǎn)品的可測性和復(fù)雜度都對可維護性有影響。
可移植性
可移植性指一種計算機上的軟件轉(zhuǎn)置到其它計算機上的能力。軟件移植是實現(xiàn)功能的等價聯(lián)系,而不是等同聯(lián)系。從狹義上講,是指可移植軟件應(yīng)獨立于計算機的硬件環(huán)境;從廣義上講,可移植軟件還應(yīng)獨立于計算機的軟件,即高級的標(biāo)準(zhǔn)化的軟件,它的功能與機器系統(tǒng)結(jié)構(gòu)無關(guān),可跨越很多機器界限。
性能測試目的是驗證軟件系統(tǒng)是否能夠達到用戶提出的性能指標(biāo),同時發(fā)現(xiàn)軟件系統(tǒng)中存在的性能瓶頸,優(yōu)化軟件,最后起到優(yōu)化系統(tǒng)的目的。性能測試類型包括壓力測試、負載測試,強度測試,容量測試等。因為各屬性之間在范圍上有重疊,很多非功能屬性的名字是可以通用的。
壓力測試
一般來說,壓力測試的目的是要通過模擬比預(yù)期要大的工作負載來讓只在峰值條件下才出現(xiàn)的缺陷曝光。內(nèi)存泄漏、競態(tài)條件、
數(shù)據(jù)庫中的線程或數(shù)據(jù)行之間的死鎖條件、和其他同步問題等等,都是壓力測試能發(fā)掘出來的常見缺陷。 壓力測試主要是為了測試硬件系統(tǒng)是否達到需求文檔設(shè)計的性能目標(biāo),譬如在一定時期內(nèi),系統(tǒng)的cpu利用率,內(nèi)存使用率,磁盤I/O吞吐率,網(wǎng)絡(luò)吞吐量等。
負載測試
負載測試是要探討在高峰或高于正常水平的負載下,系統(tǒng)或應(yīng)用軟件會發(fā)生什么情況。例如,一個網(wǎng)絡(luò)服務(wù)的負載測試會試圖模擬幾千名用戶同時連線使用該服務(wù)。測試的主要是軟件系統(tǒng)的性能,譬如軟件在一定時期內(nèi),最大支持多少并發(fā)用戶數(shù),軟件請求出錯率等。
平均無故障時間(MTBF)測試
MTBF測試是測量系統(tǒng)或應(yīng)用軟件在出錯或當(dāng)機前的平均運行時間。這一測試有幾個變體,包括平均無錯時間(MTTF)或平均無當(dāng)機時間(MTTC)。技術(shù)含義略有不同,但實踐上,這些詞匯都是一個意思。
低資源測試
低資源測試是要確定當(dāng)系統(tǒng)在重要資源(內(nèi)存、硬盤空間或其他系統(tǒng)定義的資源)降低或完全沒有的情況下會出現(xiàn)的狀況。重要的是要預(yù)估將會發(fā)生什么,例如為文件存盤而無足夠空間、或一個應(yīng)用程序的內(nèi)存分配失敗時將會發(fā)生什么。
容量測試
與負載測試非常相似,容量測試一般是用來執(zhí)行服務(wù)器或服務(wù)測試。目的是要確定系統(tǒng)最大承受量,譬如系統(tǒng)最大用戶數(shù),最大存儲量,最多處理的數(shù)據(jù)流量等。容量模型通常建立在容量測試數(shù)據(jù)基礎(chǔ)上。有了這些數(shù)據(jù),營運團隊(Operations)就能定計劃什么時候增加系統(tǒng)容量:要么增加單機資源,如RAM、CPU和磁盤空間等;要么干脆增加計算機數(shù)目。
重復(fù)性測試
重復(fù)性測試是為了確定重復(fù)某一程序或場景的效果而采取的一項簡單而“粗暴”(brute force)的技術(shù)。這個技術(shù)的精髓是循環(huán)運行測試直到達到一個具體界限或臨界值,或者是不妙的境況。舉個例子,一個操作也許會泄漏20字節(jié)的內(nèi)存。這并不足以在軟件的其他地方產(chǎn)生任何問題,但如果測試連續(xù)運行2000次,泄漏就可以增長到4萬字節(jié)。如果是提供核心功能的程序有泄漏,那么這個重復(fù)性測試就抓到了只有長時間連續(xù)運行該軟件才能發(fā)現(xiàn)的內(nèi)存泄漏。通常有更好的辦法來發(fā)現(xiàn)內(nèi)存泄漏,但有時候,這種簡單“粗暴”的方法也可以很有效。
兼容性測試
兼容性測試是指測試軟件在特定的硬件平臺上、不同的應(yīng)用軟件之間、不同的操縱系統(tǒng)平臺上、不同的網(wǎng)絡(luò)等環(huán)境中是否能夠很友好的運行的測試。主要測試軟件是否能在不同的操作系統(tǒng)平臺上兼容,或測試軟件是否能在同一操作平臺的不同版本上兼容;軟件本身能否向前或向后兼容;測試軟件能否與其他相關(guān)的軟件兼容;數(shù)據(jù)兼容性測試,主要是指數(shù)據(jù)能否共享等。
安全性測試
安全性測試是檢查系統(tǒng)對非法侵入的防范能力。主要包括用戶認(rèn)證、系統(tǒng)網(wǎng)絡(luò)安全和數(shù)據(jù)庫安全方面的測試。安全測試期間,測試人員假扮非法入侵者,采用各種辦法試圖突破防線。例如:想方設(shè)法截取或破譯口令;專門開發(fā)軟件來破壞系統(tǒng)的保護機制;故意導(dǎo)致系統(tǒng)失敗,企圖趁恢復(fù)之機非法進入;試圖通過瀏覽非保密數(shù)據(jù),推導(dǎo)所需信息等。理論上講,只要有足夠的時間和資源,沒有無法進入的系統(tǒng)。因此系統(tǒng)安全設(shè)計的準(zhǔn)則是使非法侵入的代價超過被保護信息的價值,此時非法侵入者已無利圖。
輔助功能測試
輔助功能測試保證軟件公司開發(fā)的軟件能被傷殘人使用。其中任何應(yīng)用程序都必須測試的特性包括:操作系統(tǒng)的設(shè)置測試、“內(nèi)置”輔助特性的測試(包括Tab 鍵順序、熱鍵和快捷鍵)、編程訪問的測試、以及輔助的技術(shù)工具的測試。輔助功能測試的一個重要方面就是使用輔助功能工具去測試應(yīng)用程序, 這些工具包括,屏幕閱讀器、放大鏡、語音識別或者其他輸入程序。
本地化測試
本地化就是將軟件版本語言進行更改,本地化測試的對象是軟件的本地化版本。本地化測試的目的是測試特定目標(biāo)區(qū)域設(shè)置的軟件本地化質(zhì)量。本地化測試的環(huán)境是在本地化的操作系統(tǒng)上安裝本地化的軟件。從測試方法上可以分為基本功能測試,安裝/卸載測試,當(dāng)?shù)貐^(qū)域的軟硬件兼容性測試。測試的內(nèi)容主要包括軟件本地化后的界面布局和軟件翻譯的語言質(zhì)量,包含軟件、文檔和聯(lián)機幫助等部分。
配置測試
配置測試就是測試軟件是否和系統(tǒng)的其他與之交互的元素之間兼容,如瀏覽器、操作系統(tǒng)、硬件等,驗證被測軟件在不同的軟件和硬件配置中的運行情況。配置測試執(zhí)行的環(huán)境是所支持軟件運行的環(huán)境。測試環(huán)境適合與否嚴(yán)重影響測試結(jié)果的真實性和正確性。硬件環(huán)境指測試必須的服務(wù)器、客戶端、網(wǎng)絡(luò)連接設(shè)備、打印機等,軟件環(huán)境指被測試軟件運行時的操作系統(tǒng)、軟件平臺、數(shù)據(jù)庫其他應(yīng)用軟件構(gòu)成的環(huán)境。
可用性測試
可用性測試是在產(chǎn)品或產(chǎn)品原型階段實施的通過觀察或訪談或二者相結(jié)合的方法,發(fā)現(xiàn)產(chǎn)品或產(chǎn)品原型存在的可用性問題,為設(shè)計改進提供依據(jù)。可用性測試不是用來評估產(chǎn)品整體的用戶體驗,主要是發(fā)現(xiàn)潛在的誤解或功能在使用時存在的錯誤。可用性測試適于解決的問題:確定測試產(chǎn)品的可用性水平;與預(yù)期目標(biāo)、與競爭對手、與老版設(shè)計相比的可用性水平;比較不同方案,確定哪個方案更加可行。
一些在設(shè)計階段能幫助發(fā)現(xiàn)潛在的性能問題的技巧:
提出疑問:
找出有潛在性能問題的地方。對網(wǎng)絡(luò)交通的擁塞狀況、內(nèi)存管理的效率、數(shù)據(jù)庫設(shè)計的合理性、或其他任何有關(guān)地方提出疑問。即使你并沒有性能設(shè)計的解決方案,而只是通過讓其他團隊成員考慮性能問題,測試工程師也一樣能夠產(chǎn)生很大的影響力。
考慮全局:
不是片面地考慮局部的優(yōu)化,而是考慮全面的用戶場景。你將會在整個開發(fā)過程中有相對充足的時間深入性能場景的細節(jié),但是在設(shè)計階段的時間最好是花費在考慮從頭到尾的場景上。
明確目標(biāo):
象“響應(yīng)時間應(yīng)該很快”這樣的目標(biāo)是不可度量的。應(yīng)用SMART(Specific-具體的, Measurable-可度量的, Achievable-可實現(xiàn)的, Relevant-相關(guān)的, Time-bound – 有時限的)標(biāo)準(zhǔn)來設(shè)計目標(biāo)。舉個例子,“每個用戶操作的執(zhí)行時間必須不超過100毫秒,或上一版本的10%的時間之內(nèi)將控制權(quán)返回應(yīng)用程序”。
還有一個要考慮的技巧是預(yù)測哪里可能有性能問題,或者說分辨出哪些操作對用戶來說是最重要的,從而是需要度量的。而往往最有效的辦法就是在設(shè)計階段就定義這些場景。
注:本文為《微軟的軟件測試之道》一書第12章內(nèi)容以及網(wǎng)絡(luò)收集后整理后的知識筆記,感謝本書作者Alan Page及網(wǎng)絡(luò)內(nèi)容相關(guān)作者。