看了coderzh大神寫的gtest(http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)使用的帖子,覺得gtest這個工具比較好用。就想引入的現在的測試工作中,但是我從事的是嵌入式的的軟件測試,使用的是嵌入式的linux系統,芯片是海思等芯片。無法直接使用gtest這個工具,用Google百度搜素了半天,也沒有找到使用的案例。
但是這么好的工具,不能用實在是可惜,我偏不信這個邪。經過了多次嘗試,下面的方法可行。
詳細的過程如下:
總體思路是:
1、 使用嵌入式平台的交叉編譯工具編譯gtest,編譯出libgtest.a或者libgtest.so
2、 編寫測試代碼
3、 使用libgtest庫與測試代碼一起交叉編譯出目標平台的可執行程序
4、 在目標平台執行測試
一、編譯Gtest
配置編譯腳本
下載gtest代碼,使用tar命令解壓,進入gtest-1.6.0文件夾下,ls查看文件,里面有Makefile文件,但是我們不能使用它進行編譯,必須使用對應平台的編譯器。
使用configure配置文件來配置我們要使用的編譯器(這里以我使用的海思編譯器為例):
配置命令如下:
./configure--host=arm-hisiv100nptl-linux CC=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-gcc CXX=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-g++
解釋下這個命令的的各個參數的意義:
l --host是指編譯目標的平台名稱,這里是:arm-hisiv1000nptl-linux,
l CC是指C語言的GCC交叉編譯器的路徑,這里=號后是編譯器的絕對路徑
l CXX是是C++語言的G++交叉編譯器的路徑,這里=號后是編譯器的絕對路徑
紅色的字體是根據實際的需要進行修改,不同平台用不用的名稱,編譯器安裝路徑不同,也要修改路徑。
配置命令執行時如果沒有錯誤,就說明配置完成,可以進行下一步了。
編譯GTEST
因google已經提供了Makefile文件,我們的編譯工作就比較簡單了。在配置好編譯器路徑后,直接使用make命令來編譯。
不過建議在編譯前先執行 make clean命令,先清理以前編譯生成的文件。
執行make命令,等待編譯完成,沒有提示錯誤,編譯完成。
到lib/.libs/目錄下查看編譯結果:
里面生成了我們需要的libgtest.a文件。
后續在進行測試時,不需要每次都編譯gtest工程,生成libgtest.a文件,只需要編譯一次即可。
備注說明:
編譯生成的產物有libgtest.a和libgtest.so文件,具體使用哪個看個人喜好。本文以靜態庫libgtest.a為例。
二、編寫測試代碼
下面進入到測試代碼編寫階段。
大家熟悉了gtest的使用方法,coderzh已經描述的很清楚了,這里不在詳細描述了,我們直接看下面的例子,講述如何來編寫測試用例。
我們以下面的這個函數為例:
intBrdEthQueryInfo(TEthInfo *ptInfo)
我們以第一個函數BrdEthQueryInfo為例,來編寫一個測試用例:
Main函數編寫如下:
這里引入了兩個頭文件,作用是用來使用drvlib.a和libgtest.a兩個庫中的函數,用例的編寫形式就是:
TEST(TestSuiteName,TestCaseName)
{
EXPECT_EQ();
}
第一個參數:TestSuiteName,即測試套名稱,對於一個被測函數,我們認為是一個測試套,即TestSuite,里面可以包含多個測試用例,即Testcase。
例如被測函數int BrdEthQueryInfo(TEthInfo *ptInfo),它有兩種返回值,0和-1,則我們設計兩個測試用例:
TEST(Test_BrdEthQueryInfo,test_Eth_nomarl)
TEST(Test_BrdEthQueryInfo,test_Eth_fail)
在這兩個測試用例中,Test_BrdEthQueryInfo的名稱是不變的,而第二個參數的是變的,分別為test_Eth_nomarl和test_Eth_fail,即測試一個函數的兩個返回值情況。
把編寫的測試代碼保持為文件:sample.c。准備下一步的編譯。
三、編譯測試文件
在執行編譯之前,我們需要做一個事情,就是把libgtest.a和gtest的頭文件復制到drvlib的測試代碼目錄下。同時,也需要把libdrv.a和頭文件復制到對應的目錄下。(不復制當前目錄下也可以,需要在編譯腳本中指定它們的路徑)
復制完成后,就要執行最后一步編譯了。編譯命令如下:
/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-g++ \ 編譯器路徑
-o ethtest2 sample.c \ -o是編譯參數,生成目標文件,sample.c是源代碼文件
libgtest.a \ libdrv.a路徑,是指定libdrv.a的路徑。
libdrv.a \
-I. \ 鏈接到libgtest.a庫,-I. 是指定gtest頭文件的位置,因gtest的頭文件在當前目錄下,就使用-I.(記住有個點)
-I../../api \ -I../api是指定的drvlib的頭文件路徑,
-lpthread -lpthread是編譯時使用多線程庫。
執行命令,無錯誤,生成目標文件:ethtest2。
四、執行測試
把生成的目標程序復制到Hisi平台的設備上,可以使用ftp的方法。首先修改文件的權限,chmod a+x filename
./filename 來執行文件。查看執行結果:
執行結果顯示,執行了一個testcase,包含了兩個tests。測試結果都是PASSED。
五、測試原理說明
Gtest測試原理為:把被測試函數代碼與gtest庫聯合編譯,然后在測試平台上執行,判斷函數的執行結果是否與預期結果相符,如果相符則PASS,否則FAIL。
Gtest白盒測試架構,不涉及源代碼的修改,不影響原有代碼結構,具有良好的擴展性和適應性。
編譯生成文件為可執行文件,非常方便。
gtest使用詳細的信息可以參考:
http://www.cnblogs.com/coderzh/archive/2009/03/31/1426758.html
里面有詳細的使用介紹。