嵌入式平臺使用gtest進行白盒測試

看了coderzh大神寫的gtest(http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)使用的帖子,以爲gtest這個工具比較好用。就想引入的如今的測試工做中,可是我從事的是嵌入式的的軟件測試,使用的是嵌入式的linux系統,芯片是海思等芯片。沒法直接使用gtest這個工具,用Google百度搜素了半天,也沒有找到使用的案例。html

可是這麼好的工具,不能用實在是惋惜,我偏不信這個邪。通過了屢次嘗試,下面的方法可行。linux

 

 詳細的過程以下: api

整體思路是:多線程

一、  使用嵌入式平臺的交叉編譯工具編譯gtest,編譯出libgtest.a或者libgtest.so架構

二、  編寫測試代碼函數

三、  使用libgtest庫與測試代碼一塊兒交叉編譯出目標平臺的可執行程序工具

四、  在目標平臺執行測試測試

1、編譯Gtest

配置編譯腳本

下載gtest代碼,使用tar命令解壓,進入gtest-1.6.0文件夾下,ls查看文件,裏面有Makefile文件,可是咱們不能使用它進行編譯,必須使用對應平臺的編譯器。字體

使用configure配置文件來配置咱們要使用的編譯器(這裏以我使用的海思編譯器爲例):ui

配置命令以下:

./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爲例。

 

2、編寫測試代碼

下面進入到測試代碼編寫階段。

你們熟悉了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。準備下一步的編譯。

3、編譯測試文件

在執行編譯以前,咱們須要作一個事情,就是把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。

4、執行測試

把生成的目標程序複製到Hisi平臺的設備上,可使用ftp的方法。首先修改文件的權限,chmod a+x filename

./filename 來執行文件。查看執行結果:

 

 

執行結果顯示,執行了一個testcase,包含了兩個tests。測試結果都是PASSED。

5、測試原理說明

Gtest測試原理爲:把被測試函數代碼與gtest庫聯合編譯,而後在測試平臺上執行,判斷函數的執行結果是否與預期結果相符,若是相符則PASS,不然FAIL。

Gtest白盒測試架構,不涉及源代碼的修改,不影響原有代碼結構,具備良好的擴展性和適應性。

編譯生成文件爲可執行文件,很是方便。

 

gtest使用詳細的信息能夠參考:

http://www.cnblogs.com/coderzh/archive/2009/03/31/1426758.html

裏面有詳細的使用介紹。

相關文章
相關標籤/搜索