我主要是想使用單元測試,VS2010是有自己的單元測試的,雖然我不抵觸Microsoft的東西,但是自己做的非工業級的東西,去用Microsoft的解決方案是找罪受~所以使用了Google的測試方案。主要查閱了國外的一篇資料,雖然那位寫得實在簡略,但寫得還是不錯的,我補充梳理了一下。
下載部署GTest
首先去下載Google Test,網址為http://code.google.com/p/googletest/。我寫此文的時候是1.6版。
解壓之,因為要反復使用,所以最好放到固定的目錄。我解壓到了D:\Selah\VSProjects\Source下。打開解壓后的目錄,結構如下:

其中要接觸的目錄有:
../ - 即D:\Selah\VSProjects\Source\gtest-1.6.0,我把它設置為$(GTest),這樣就不用每次寫一長串路徑了。
include - 包含目錄,里邊有頭文件,測試時要用到。
msvc - Visual Studio的項目工程文件,已經配置好了的,用它生成二進制庫。
運行msvc下的gtest.sln文件,它會提示自動升級為新的解決方案,然后生成即可。記得Debug和Release都要生成,分別用於測試Debug和Release方案的代碼。我使用的是以下4個文件,還可以使用另外一個.sln文件,請自行文檔之~
msvc\gtest\Debug - Debug方案下的二進制文件:gtestd.lib、gtest_maind.lib(注意主文件名的d后綴)
msvc\gtest\Release - Release方案下的二進制文件:gtest.lib、gtest_main.lib
Solution配置
為了讓測試和程序運行互不干擾,老外將待測試模塊和程序入口分離為兩個項目,這樣程序和GTest都可以訪問待測試模塊,互不沖突。最簡單的情況下,Solution下有3個Project:
BaseCode - 待測試模塊。我是要做單元測試的,所以頭文件里要包含信息。(比如你要測試void Foo(),起碼要在頭文件里Declare一下吧~)
RunBaseCode - 程序入口。就是將程序一分為二為兩部分。程序入口調用BaseCode生成的模塊,實現程序功能。
TestBaseCode - 測試程序。這個是書寫GTest測試用例的Project。除了要調用BaseCode生成的模塊(否則你測試個毛線啊)。並且,他還要調用GTest的模塊(否則你用毛線測試啊)。

另外就是路徑問題,為了簡便,我把路徑寫成了宏。宏保存在項目屬性表里,這個表除了可以保存宏,還能保存后邊提到的路徑,可以備份了下次直接用。

具體過程不說了,這圖一看就懂吧,之后就可以使用$(GTest)代替那長串路徑了。

Project - BaseCode配置
Debug/Release通用:
項目屬性 - 配置屬性 - 常規: 配置類型 = 靜態庫(.lib)。你也可以用動態庫,不過要或重新編譯GTest,具體文檔之~靜態庫很好的,不要看不起他。
Debug:
項目屬性 - 配置屬性 - C/C++ - 代碼生成: 運行庫 = 多線程調試(/MTd)。如果不這么做,結果就是報錯~
Release:
項目屬性 - 配置屬性 - C/C++ - 代碼生成: 運行庫 = 多線程(/MT)。如果不這么做,結果就是報錯~
Project - RunBaseCode配置:
因為要調用BaseCode的lib,所以配置一下項目依賴項(依賴BaseCode)。要不然,BaseCode還沒生成呢,就開始生成RunBaseCode,結果只能是報錯。

Debug/Release通用:
項目屬性 - 通用屬性 - 框架和引用: 添加對BaseCode的引用。感覺和.Net的程序集引用有點像。如果不這么干(比如對此有很深的厭惡之情),可以配置附加庫路徑以及附加依賴項(配置TestBaseCode時有介紹)。

項目屬性 - 配置屬性 - C/C++ - 常規: 附加包含目錄 += $(SolutionDir)\BaseCode。其實是可有可無,如果設置了,引用頭文件可以使用:
#include <BaseCode.h>
否則,就只能使用相對或者絕對路徑了:
#include "../BaseCode/BaseCode.h
Project - TestBaseCode配置
除了和RunBaseCode相同的配置外(因為它也要調用BaseCode.lib,重復工作我不寫了),還要進行如下配置。
Debug/Release通用:
項目屬性 - 配置屬性 - C/C++ - 常規: 附加包含目錄 += $(GTest)\include。這樣方便包含GTest的頭文件。
項目屬性 - 配置屬性 - 連接器 - 常規: 附加庫目錄 += $(GTest)\msvc\gtest\$(IntDir)。如果之前沒有引用BaseCode,要在這里做類似設置。
Debug:
項目屬性 - 配置屬性 - C/C++ - 代碼生成: 運行庫 = 多線程調試(/MTd)。如果不這么做,結果就是報錯~(和BaseCode的設置相同)
項目屬性 - 配置屬性 - 連接器 - 常規: 附加依賴項 += gtestd.lib;gtest_maind.lib。如果之前沒有引用BaseCode,要在這里做類似設置。
Release:
項目屬性 - 配置屬性 - C/C++ - 代碼生成: 運行庫 = 多線程(/MT)。如果不這么做,結果就是報錯~(和BaseCode的設置相同)
項目屬性 - 配置屬性 - 連接器 - 常規: 附加依賴項 += gtest.lib;gtest_main.lib。
生成即測試
老外果然有思路。這樣配置了TestBaseCode,就不用執行它了,每次生成解決方案,就會自動執行測試。
項目屬性 - 配置屬性 - 生成事件 - 后期生成事件: 命令行 = $(TargetDir)$(TargetFileName)。效果:

如果執行測試的exe文件,會一閃而過,可以放到cmd里邊執行。效果還是不錯的。Over~~

