前言
關於單元測試的重要性、gtest的優缺點等就不說了。之前項目是沒有做單元測試的,在VS的解決方案中,只有一個可執行的工程,其他的工程都是以DLL庫的形式提供。本文只針對使用VS對DLL庫進行單元測試,做一些記錄。
下載編譯gtest
下載gtest不多說,下載什么版本也沒太大關系,我下載的是1.7版。在Windows下編譯gtest步驟:
(1)將gtest-1.7.0.zip進行解壓縮;
(2)用vs打開msvc目錄下的gtest.sln工程,需要進行轉換編譯器;
(3)打開后有四個工程gtest、gtest_main、gtest_prod_test、gtest_unittest;
(4)由於單元測試一般在Debug模式下進行,只需在Debug下編譯gtest工程即可,會在msvc/gtest/Debug下生成gtestd.lib庫。
新增Gtest_Debug模式
原來工程中已經包含Debug和Release模式,為了不影響以前的工程的使用,專門添加一個Gtest_Debug模式,用於做單元測試。步驟如下



按確定后,會生成對應的Gtest_Debug模式。這時候,可以使用新建的Gtest_Debug編譯一把,看能不能編譯成功,生成的文件和原來的Debug模式是一模一樣的。



部署Gtest頭文件與庫
(1)把解壓出來的gtest頭文件目錄拷貝到項目原有的include目錄

(2)把編譯出來的gtestd.lib拷貝到項目的Debug模式生成的目錄

改造原代碼,添加Gtest的main函數
因為每個實現文件都會包含stdafx.h,避免每個單元測試的實現文件都要添加gtest的頭文件,所以在此頭文件中添加如下代碼。其中GTEST_DEBUG這個宏是前面步驟添加的,這段代碼只有在Gtest_Debug模式下才會有效。
1 #ifdef GTEST_DEBUG 2 #include "gtest/gtest.h"
3 #pragma comment(lib, "gtestd.lib")
4 #endif
由於把DLL庫改為exe應用程序,所以需要添加main函數,以便執行gtest的用例。在工程中新建一個GtestMain.cpp文件,添加如下代碼(主要是main函數的實現,用例是用於測試是否成功的)。
1 #include "stdafx.h"
2
3 #ifdef GTEST_DEBUG // 這段代碼只能在Gtest_Debug模式下運行
4
5 int add(int a, int b) 6 { 7 return a + b; 8 } 9
10 TEST(fun, add) 11 { 12 EXPECT_EQ(1, add(2, -1)); 13 EXPECT_EQ(5, add(2, 3)); 14 } 15
16 int main(int argc, wchar_t* argv[]) 17 { 18 testing::InitGoogleTest(&argc, argv); 19 return RUN_ALL_TESTS(); 20 } 21
22 #endif
重新編譯工程,會發現工程生成的是exe程序,而不再是DLL程序,把工程設置為啟動項目,執行程序即可看到測試結果。

編譯測試用例
建議在工程目錄下專門建一個test的目錄,用於存放測試用例的文件,測試用例的文件和實際工程代碼都可以加入到VS工程中。所有的測試用例代碼都需要用#ifdef GTEST_DEBUG ... #endif來括起來,以便與實際的工程代碼隔離。
參考
使用gtest給DLL工程編寫單元測試
http://blog.csdn.net/sogouauto/article/details/47731523
gtest簡介及簡單使用
http://blog.csdn.net/fengbingchun/article/details/39667571
