1. 程式人生 > >Linux下Google Test測試環境安裝和使用,實戰總結

Linux下Google Test測試環境安裝和使用,實戰總結

Google Test (libgtest) 是由谷歌開發的一款基於xunit框架的跨平臺單元測試框架,C#上的NUnit,Java的JUnit寫單元測試非常容易,也不乏視覺化工具與IDE整合外掛,深受喜歡測試區洞開發的程式設計師的喜愛。但對於C++來說,寫測試就看著麻煩一些。但如果用習慣了,google test還是不錯的。google test更多的資訊這裡就不贅述了。下面根據我的實踐,總結以下安裝和第一次編寫google test所需要做的事情,網上雖然有些教程,但我遇到的問題往往要綜合很多篇文章才能解決。這裡我根據自己的實踐,綜合了幾篇文章裡的方法,結合ubuntu系統,寫了一個更詳細的介紹。



Step1.首先下載安裝google test

對於ubuntu系統,可直接從軟體源裡下載更新libgtest-dev
或者 sudo apt-get install libgtest-dev
這樣會自動把googtest的標頭檔案安裝到/usr/include/gtest目錄下,而原始檔在/usr/src/gtest目錄下


也可以自己從https://googletest.googlecode.com上下載gtest的最新版本,不過google code網站經常被牆,到時候可以考慮從別的地方下載。
比如對於1.6.0版本,wget gtest-1.6.0.zip https://googletest.googlecode.com/files/gtest-1.6.0.zip
然後解壓:
假定下載到根目錄下,直接:
[email protected]
:~$ unzip gtest-1.6.0.zip
[email protected]:~$ cd gtest-1.6.0


另外,把下載的gtest原始碼下面的include/gtest目錄拷貝到全域性標頭檔案目錄,如:


[email protected]:~/gtest-1.6.0$ cp -r include/gtest/ /usr/local/include/

[email protected]:~/gtest-1.6.0$ cp -r include/gtest/ /usr/include/
然後在用到gtest的檔案中,用#include <gtest/gtest.h>指令就可以讓編譯器找到gtest的標頭檔案了。


Step2.編譯gtest的連結庫,因為原則上這個連結庫是不能下載的,最好本地編譯一份用:



執行
[email protected]:~/gtest-1.6.0$ g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ./src/gtest-all.cc
會在當前目錄產生gtest-all.o


${GTEST_DIR}表示Gtest原始檔路徑,這裡如果當前目錄就是原始檔路徑,${GTEST_DIR}用"./"
-I指定的兩個搜尋路徑可以去掉,因為所需要的標頭檔案都已經放到系統的include下和當前路徑下了。 (g++ ./src/gtest-all.cc )


然後


~/gtest-1.6.0$ g++ -I./include -I./ -c ./src/gtest_main.cc


會在當前目錄產生gtest_main.o,這個不是必須的,這裡麵包含了gtest程式碼裡提供的一個預設的main函式(執行RUN_ALL_TESTS()),所以連結到自己寫的測試函式裡,可以不用在test檔案裡寫main函式,如有特殊需要,還是得自己寫main函式。


然後把兩個編譯輸出檔案合併成一個靜態庫libgtest.a,可以拿出來,便於放到以後的gtest工程下連結用。
~/gtest-1.6.0$ ar -rv libgtest.a gtest-all.o gtest_main.o


然後開始嘗試寫第一個測試,這裡就是和普通的linux C++開發步驟一樣。我們可以用gtest裡提供的sample來實驗,也可以自己寫一個很簡單的測試。

sample.h

//sample.h
#pragma once
int fun(int a, int b);
sample.cpp
#include"sample.h"
int fun(int a, int b)  
{  
    return (a-b);  
}  
test.cpp這裡我們用了四種ASSERTION(斷言)方法,給初學者一個印象,具體gtest的各種斷言用法還要參考gtest文件
#include "gtest\gtest.h"  
#include "sample.h"
  
 //TEST (gtest macro),fun:function name to test, "case1" test case name
TEST(fun, case1)  
{  
        EXPECT_LT(-2, fun(1, 2)); 
	EXPECT_EQ(-1, fun(1, 2));  
	ASSERT_LT(-2, fun(1, 2)); 
	ASSERT_EQ(-1, fun(1, 2));  
}  
  
/*
int _tmain(int argc, _TCHAR* argv[])  
{  
    testing::InitGoogleTest(&argc, argv);  
    return RUN_ALL_TESTS();  
} 
*/




Step3. 編譯要測試的程式碼(假設檔名為sample.cpp)



g++ -c sample.cpp


 
Step4. 編譯單元測試的程式碼(假設檔名為test.cpp)


g++ -c test.cpp


 
Step5. 與libgtest.a或其他需要的庫連結、生成可執行程式



g++ test.o sample.o libgtest.a -o test -lpthread


-lpthread是必須要有的,否則連結時會出錯gtest-all.cc:(.text._ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE16GetOrCreateValueEv[_ZNK7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEE16GetOrCreateValueEv]+0x7a): undefined reference to `pthread_setspecific'


Step6. 執行生成的test檔案,可輸出測試結果。


參考文章:


Linux平臺如何編譯使用Google test寫的單元測試?  


gtest編譯sample檔案出錯


Linux環境下配置Google Test、TBB、OpenMP和OpenCV


ubuntu下使用google test的一些注意事項