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


看了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

里面有詳細的使用介紹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM