LTP是一個聯合項目主要驗證Linux系統的可靠性、健壯性和穩定性,最先由SGI™啟動,并由IBM®負責維護。2012年4月發布的最新穩定版本已擁有3000+的case(case增長并不多,06年時就有2900+的case),用于測試Linux kernel以及相關功能。使用的編程語言主要是ANSI-C(占94%),以及Bash腳本(占5%),還有Perl(占0.62%)。它也有一套使用ANSI-C和Bash寫case的模板。
Autotest是后啟之秀,最早被用于Linux kernel自動化測試的框架,使用python語言,現在也被多個其它項目所應用。新case能較容易添加,ANSI-C或者Bash寫的case也能較方便地融入此框架。針對Linux kernel的測試項目地址是http://test.kernel.org,用于交流、共享和分析測試數據。Autotest框架分服務端和客戶端,在監聽到有新版本發布(三位版本、四位版本、-rc版本、-git版本)時,會自動觸發執行自動化,執行過程見下圖四。
圖四 Autotest自動化執行流程
CrackerJack 是一個主要負責linux kernel兼容性測試的項目,找出不同內核版本系統調用的diff情況,已支持317個系統調用。它也是使用Autotest框架執行,diff結果是個矩陣可見下圖五或者網址http://ossipedia.ipa.go.jp/crackerjack/compare_results.html。Diff比較是智能的,并非單獨地比較輸出結果,比如time時間調用每次系統返回都是不一樣的,比較時就是檢查兩次調用之間的時間差。
圖五 CrackerJack diff結果
測試方式
測試手段是多樣的:單測、集成測試、功能測試、性能測試、壓力測試、回歸測試等,但沒有一種手段在任意時候都合適。質量保證是多方面的,除了要求開發者寫出高質量代碼外,靜態代碼檢查、還要有頻繁且嚴格的code review,下面列舉一些針對Linux kernel特點的測試。
1. 開發者測試。鼓勵開發者寫單元測試,但很多時候有太多的依賴假設,單測等是很難的,比如要測試U盤在讀寫過程中被拔掉,再插上的情況,只有實際運行執行才能驗證程序是否正確。無論開發人員使用何種方式,都需要保證負責的代碼是經過測試了的。不需要在所有版本上運行,但需要確保代碼質量,不能假定的字節序、字節長度,都應該使用標準接口。有些時候是修復別人報的bug,而開發人員又沒有復現該bug的環境,此時修改也需要由bug提交者確認在其環境測試通過或者在其它能復現該bug的環境驗證通過。對修改代碼的質量保證方法還包括交由其它人評審通過或測試通過。編譯器的報警也是需要修復的。
2. 社區測試。社區開發模式,也強調社區測試,鼓勵大家在做好數據備份前提下使用最新發布的版本,類似軟件正式發布前的試用版本,以確保在不同的機器不同的平臺上能實際正常運行。對此類版本的使用是有風險的,有可能導致系統崩潰。通常在系統安裝后,啟動時也會比較小心,逐項加載啟動,以檢查每步都是正常的。還會做一些非常規的操作,也就是異常測試。
3. 配置測試。Linux kernel的配置也較復雜,以支持較好的靈活性和可擴展性,測試需要盡量地覆蓋不同的配置組合條件。有的做法是隨機配置,再編譯運行啟動,7*24小時重復不間斷地做,以找出可能存在的問題。做的過程中也有優化,比如關閉一些不必要的選項,減少編譯的時間。
有些配置項是有助于測試執行時監控問題和分析問題的,比如打印出debug日志,或者在出錯時打印盡可能多的信息,kernel在某些設置下自身也會做一些運行過程中的檢查,如CONFIG_DETECT_SOFTLOCKUP能檢查出內核部分是否在內核模式中循環超過60秒的bug,這類配置通常會在測試時打開。
4. 硬件測試。驗證kernel對不同平臺的支持時,會使用些不常用的硬件,以及不常用的硬件組合,不同的體系架構。
5. 對待變化。由于Linux kernel經常變化,不可能每次變動都同等對待。針對-rc候選發布版本,需要嚴格地測試,因為它們一旦被認為是穩定的之后就會正式發布,并很可能由發行商選中到發行版中。而針對-next樹或者以前的-mm樹,因為它們太容易變化了,沒有時間和資源運行全量測試,通常只執行最基本的測試。
6. 工具。Linux測試工具眾多,可見http://ltp.sourceforge.net/tooltable.php,覆蓋率、安全性、調試、網絡、性能等方方面面工具都應有盡有。
7. 性能測試。Linux kernel對性能要求也比較高,性能測試通常要注意的幾點:(1)最好是利用benchmark,以取得可信數據;(2)避免I/O緩存因素,緩存對性能影響較大;(3)確保測量環境的穩定性,特別是比較前后版本時。Autotest中也包含性能測試自動化,一次升級導致的性能問題和修復如下圖六所示,2.6.14-rc2-mm1版本與2.6.14-rc1-mm1版本相比執行時間由101增加到了111,性能降低了10%,直到2.6.16-rc1-mm4版本才修復。
圖六 Autotest性能測試執行結果圖
8. 可測性。Linux kernel在可測性方面也有較好支持。
(1)內核模塊化。啟動內核模塊支持后,內核的某些部分就可以在需要的時候才裝載到內存中,使內核變得更小,運行更快。模塊化的內核部分可以在系統運行期間裝載或者卸載。
(2)內核hacking 選項,編譯一個測試用的內核,有助有內核特定功能的調試,也需要注意有部分選項會導致性能降低。
(3)Magic SysRq鍵,神奇的鍵盤快捷鍵,可以利用快捷鍵直接向內核傳遞特定的指定。
(4)多種信息收集方式,內核的bug不一定是導致系統崩潰,一些嚴重的錯誤通過日志等表現出來,信息收集就變得猶為重要了??梢酝ㄟ^Syslog, console, dmesg等方式dump和顯示日志,除此之外,還可以通過串口和網絡控制臺遠程收集信息。
(5)kexec快速重啟系統,使用 kexec可以直接重新啟動到另一個內核,不再必須通過固件和引導裝載程序階段,能為測試節省大量時間。
原文轉自:http://qa.baidu.com/blog/?p=1026