http://www.vimlinux.com/lipeng/2014/09/12/ltp/
Testing Linux, one syscall at a time.
LTP是從SGI開始的,后由IBM 思科 富士通 SUSE Redhat等組織開發的.該工具的目標是建立一個測試套件用來驗證linux的可靠性,健壯性及穩定性.LTP測試套件包含了linux內核及相關功能的工具.
本文主要介紹關於ltp的一些基本信息.
LTP項目主頁:ltp
Github鏈接:ltp
LTP是一個驗證ltp內核功能和穩定性的測試集.用來支持linux開發過程中,通過更多的單元測試,減少bug的引入,降低bug對用戶的影響.LTP並不是用來做benchmarking測試的,而是更專注與功能,問題回歸及穩定性測試.LTP同樣不是一個標准測試,標准測試有LSB.
一 基本結構
LTP測試套件是由包含一個基本動作和一個確認基本動作工作是否正常的測試用例組成.這個測試用例通常的測試結果是PASS/FAIL.一個測試程序是包含一個或多個測試用例的可執行程序.測試程序包括相應的測試參數,這些參數包括內存測試容量,臨時文件位置,網絡測試類型等等.Test tags 是用於匹配測試程序和一組命令行參數.Test tags是測試集的基礎.
編寫測試
編寫一個測試用例比大多數想象的更容易.任何一個你編寫用於驗證內核功能的代碼都可以用來形成一個用例.
測試退出約定
通常一個簡單的判斷一個測試用例執行結果的方式就是程序的返回值.如果你的測試程序沒有得到一個預期結果或錯誤結果,程序退出是需要返回一個非零值,如exit1, 同樣如果程序得到預期的結果,需要返回0,exit(0).一些測試驅動需要去收集這些返回值.如果一個測試程序包含多個測試用例,你不知道那個出錯了,但你會知道程序出錯了.
格式化輸出
一個簡單方式處理測試結果就是每個測試用例都輸出一個標准格式的輸出結果.這個格式需要是測試人員和分析工具都能理解的格式,當測試結果都按一個標准格式輸出時工具就能夠分析測試結果.
測試工具
LTP目前沒有一個最終的測試工具.我們選擇了一個簡單的解決方式ltp-pan. Ltp-pan是一個簡單的測試驅動程序,它可以跟蹤孤兒進程和抓取測試的輸出信息.它工作方式是讀取一個包括test tags和命令行列表的文件並執行.默認的ltp-pan會隨機的從列表中選擇命令執行,並等待其結束.可以通過選擇多個命令行執行多個測試,在一定時間執行多個測試並且緩沖多個測試結果.這樣Ltp-pan可以營造出復雜的測試環境.Ltp-pan使用一個活動文件,通常叫做zoo文件來保存哪些測試在運行.這個文件包括pid,tag以及命令行的一部分.當啟動ltp-pan,它本身變成了自己的一個標簽.當一個測試標簽退出,ltp-pan會第一個字符加#的方式重寫.這個活動文件可以在多個ltp-pan實例中共享,所以當系統崩潰時,你可以通過查看一個文件,了解哪個用例造成的.
一個Ltp-pan文件包括一個測試tag列表.格式如下:
testtag testprogram -o one -p two other command line options
# This is a comment. It is a good idea to describe the test
# tags in your ltp-pan file. Tests programs can have different
# behaviors depending on the command line options so it is
# helpful to describe what each test tag is meant to verify
or # provoke.
# Some more test cases
mm01 mmap001 -m 10000
# 40 Mb mmap() test.
# Creates a 10000 page mmap, touches all of the map, sync's
# it, and munmap()s it.
mm03 mmap001 -i 0 -I 1 -m 100
# repetitive mmapping test.
# Creates a one page map repetitively for one minute.
dup02 dup02
# Negative test for dup(2) with bad fd
kill09 kill09
# Basic test for kill(2)
fs-suite01 ltp-pan -e -a fs-suite01.zoo -n fs-suite01 -f runtest/fs
測試例子 運行一個測試基本方式是:
$ ltp-pan -a ltp.zoo -n tutor sleep 4
<<<test_start>>>
tag=cmdln stime=971450564 cmdline="sleep 4" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> <<<execution_status>>> duration=103341903 termination_type=exited termination_id=0 corefile=no cutime=0 cstime=0 <<<test_end>>> $ cat ltp.zoo #9357,tutor,pan/ltp-pan -a ltp.zoo -n tutor sleep 4 #9358,cmdln,sleep 4 $
如何實現的: 這個例子展示ltp-pan兩個參數,一個活動文件,一個test tag. "sleep 4"測試程序及ltp-pan要執行的參數.這個測試會得到標記“cmdln”。 LTP-run將隨機運行一個測試,最終被cmdln,因為指定了唯一測試. 在活動文件,ltp.zoo,ltp-pan寫入pid,testlog,運行測試部分命令行.當test tag運行完成,ltp-pan會標記一個"#",代表它可以執行.這時,你能看到cmdln和tutor,如果測試機擋住,你可以讀這些文件查找哪個測試導致的.
同時運行一個測試多次.
$ ltp-pan -a ltp.zoo -n tutor -x 3 -s 3 -O /tmp sleep 1 <<<test_start>>> tag=cmdln stime=971465653 cmdline="sleep 1" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> <<<execution_status>>> duration=103326814 termination_type=exited termination_id=0 corefile=no cutime=1 cstime=0 <<<test_end>>> <<<test_start>>> tag=cmdln stime=971465653 cmdline="sleep 1" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> <<<execution_status>>> duration=103326814 termination_type=exited termination_id=0 corefile=no cutime=0 cstime=1 <<<test_end>>> <<<test_start>>> tag=cmdln stime=971465653 cmdline="sleep 1" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> <<<execution_status>>> duration=103326814 termination_type=exited termination_id=0 corefile=no cutime=0 cstime=0 <<<test_end>>>
如何工作的? 在這個例子中運行了另一個命令行,但是測試執行了3遍(-s 3)並且保持了3個test tags在同一時間執行(-x 3). -O 參數是指定臨時文件保存目錄,並且為每個緩沖結果設定標簽.可以看到cmdln運行了3次.如果 -O 沒有指定,則3次結果被混合,就沒有意義了.
Scanner Ltp-scanner 是一個測試結果分析工具,它可以理解rts風格的輸出.最終生成一個匯總結果顯示哪個用例pass,哪個用例fail.
測試流程參見下圖:
二.LTP文件結構
從 http://ltp.sourceforge.net/下載LTP測試源碼包
LTP的目錄結構基本上分為文檔目錄(doc)、測試驅動程序目錄(pan)、測試腳本目錄(testscripts)、測試用例庫(testcase)、測試命令文件目錄(runtest)、頭文件目錄(include)、庫目錄(lib)等。
* Doc:該目錄是說明文件和幫助文檔的所在地,這個目錄中對LTP的內容和每個工具都有詳細的說明。
* Pan:該目錄存儲的是LTP測試套件的測試驅動程序pan。
* Testscripts:該目錄中存儲的是可執行的測試腳本,不同方面的測試腳本的集合。
* Testcase:該目錄存儲了所有LTP測試套件中所使用的測試用例的源碼。
* Runtest:該目錄中的每個文件都是要執行的測試用例的命令集合,每個文件針對測試的不同方面。
* Include:LTP測試套件的頭文件目錄,定義了LTP自身的數據結構和函數結構。
* Lib:LTP測試套件運行時自身需要的庫文件,定義了LTP自身的各種函數。
各個文件結構之間的聯系: ---->testscripts中ltpstress.sh ---->runtest(stress.part1,stress.part2,stress.part3) ---->pan后台運行 ---->最終運行Testcase中的各個測試案例
其中runtest中 stree.part1,stree.part2,stree.part3中的測試命令或腳本 如 mmstress;來源於testcase/bin 中mmstress;而testcase/bin 中mmstress 可執行腳本或命令來源於/testcase中如 kernel,network, pounder21, commands 等源代碼編譯生成的, mmstress:kernel/mem/mtest05/mmstress.c
stress.partn中測試命令如何看? 這些命令文件包含測試用例的tag和帶有參數的測使用里,格式如下: #tag test case test1 test1 -l 10 mtest01 mtest01 -m 20 fork01 fork01
三.LTP測試方法
測試方法有兩個的階段:一個是“初始測試”,一個是“壓力測試”。 初始測試是開始測試的必要條件。初始測試包括 LTP 測試套件在硬件和操作系統上成功運轉,這些硬件和操作系統將用於可靠性運轉。LTP 測試套件包附帶的驅動程序腳本 runalltest.sh 用於驗證內核。這個腳本串行地運行一組成包的測試,並報告全部結果。也可以選擇同時並行地運行幾個實例。默認地,這個腳本執行:
* 文件系統壓力測試。
* 硬盤 I/O 測試。
* 內存管理壓力測試。
* IPC 壓力測試。
* SCHED測試。
* 命令功能的驗證測試。
* 系統調用功能的驗證測試。
壓力測試可以驗證產品在系統高使用率時的健壯性。作為 runalltest.sh 的補充,特別設計了一個名為 ltpstress.sh 的測試場景,在使用網絡與內存管理的同時並行地運行大范圍的內核組件,並在測試系統上生成高壓力負荷。ltpstress.sh 也是 LTP 測試套件的一部分。這個腳本並行地運行相似的測試用例,串行地運行不同的測試用例,這樣做是為了避免由於同時訪問同一資源或者互相干擾而引起的間歇性故障。默認地,這個腳本執行:
* NFS 壓力測試。
* 內存管理壓力測試。
* 文件系統壓力測試。
* 數學 (浮點) 測試。
* 多線程壓力測試。
* 硬盤 I/O 測試。
* IPC (pipeio, semaphore) 測試。
* 系統調用功能的驗證測試。
* 網絡壓力測試。
四.測試組合的選擇
所選擇的測試的組合必須給系統的資源帶來足夠的壓力。Linux 內核的四個主要方面可以影響系統的 響應和執行時間: CPU:用於在機器的 CPU(s)上處理數據的時間。 Memory:用於自真實存儲器中讀寫數據的時間。 I/O:用於自磁盤存儲器讀寫數據的時間。 Networking:用於自網絡讀寫數據的時間。
系統資源利用率評價階段通常需要多次嘗試才能得到合適的測試組合,並得到期望水平的利用率。在這個評價過程中,sar 工具也應該在運行。在評價運行的結論中,您應該收集並評價所有四種資源的利用率水平。 具體的測試組合修改方法。
修改方法一: runtest中 stress.part1,stress.part2,stress.part3。
如修改stress.part1中有這樣一個測試mem02,根據閱讀testcases/kernel/mem/mem/mem02.c 源代碼,可將他修改為mem02 -m 15,意思是測試15m內存。 同樣的也可以在 stress.part1,stress.part2,stress.part3 中添加、刪除一些測試, 如我們測試時就把 stress.part3中關於swap交換分區的去掉
#swapoff01 swapoff01
#swapoff02 swapoff02
#swapon01 swapon01
#swapon02 swapon02
#swapon03 swapon03
修改方法二:
前面提到的初始測試或者壓力測試都是測試的默認的,如果想測試其他的或者自己的測試案例,需要修改testcase的
Makefile,因為通過它的Makefile可以看到
SUBDIRS = ls */Makefile | sed "s/Makefile//g" | grep -v open | grep -v pounder | grep -v DOTS | grep -v kdump | grep -v realtime
sed 's//:/ /g' :想把文本中的冒號替換成空格
grep -v:顯示所有與指定模式不匹配的行
也就是說open,pounder,DOTS,kdump,realtime沒有測試,當然你可以選上或者,添加上自己的測試案例。
五.工具介紹
Gcov,lcove:
分析代碼覆蓋率
sar: 幫助我們掌握系統資源的使用情況,特別是內存和CPU 的使用情況, 是UNIX系統使用者應該掌握的工具之一 在我們的測試中,sar工具每 10 秒(當然時間間隔可以修改)鍾截取一次系統利用率的快照,並保存到結果文件。 針對sar生成的sar.data使用方法: sar -u sar.data //查看cpu使用情況 sar -r sar.data //看看memory,swap使用情況 …………………… Top:
跟sar差不多的功能,這里我們就用sar 了。
其他
什么是穩定性和可靠性?
穩定性反映的是系統不會出現異常情況;可靠性反映的是系統能夠保持正常運行而不受外界影響的能力。 系統的穩定性和可靠性通常以連續運轉時間和系統的可靠運行時間來度量。
什么是壓力測試?
壓力測試是一種破壞性的測試,即系統在非正常的、超負荷的條件下的運行情況 。用來評估在超越最大負載的情況下系統將如何運行,是系統在正常的情況下對某種負載強度的承受能力的考驗 。
為什么要進行壓力測試?
通常我們用壓力測試來判斷系統的穩定性和可靠性。
Top^
Comments