gtest 測試 MFC 項目
作者:wulong710
1. 前言
參考《圖解 MFC 程式中使用 Google 單元測試工具 GTest 進行 TDD 開發 》,簡易版。
2. 環境
使用 VS2005 編譯
下載下傳 http://code.google.com/p/googletest/downloads/list/gtest-1.5.0.zip
3. 解壓 gtest-1.5.0.zip 包,打開 gtest-1.5.0/msvc/ gtest.sln 編譯
按照 DEBUG 模式和 RELEASE 模式各編譯一遍,在檔案夾 gtest-1.5.0/msvc/gtest 中得到測試用的庫檔案 gtestd.lib 和 gtest.lib
4. 建立 MFC 對話框工程 test_mfc
5. 建立解決方案配置
Debug —— > 配置管理器—— > 活動解決方案配置—— > 建立 ,跳出建立解決方案配置對話框。 “名稱”欄填入 Debug_gtest ,“從此處複制設定”欄選擇 Debug 。确認。
圖表 1
圖表 2
圖表 3
6. 複制 gtest 頭檔案 gtest-1.5.0/include 檔案夾及庫 gtestd.lib gtest.lib 到 MFC 測試工程中
圖表 4
7. 将在 MFC 工程中指明 gtestd.lib 路徑與 include 檔案夾路徑
項目—— > 屬性—— > 配置屬性—— >c/c++ —— > 正常—— > 附加包含項目
設定 gtest 頭檔案路徑為 F:/download/gtest/test_mfc/include
圖表 5
項目—— > 屬性—— > 配置屬性—— > 連接配接器—— > 輸入—— > 附加依賴項
設定 gtest.lib 庫路徑 F:/download/gtest/test_mfc/gtestd.lib
圖表 6
8. 設定運作模式
項目—— > 屬性—— > 配置屬性—— >c/c++ —— > 代碼生成—— > 運作時庫—— > 多線程調試 (/MTd)
圖表 7
9. 項目—— > 屬性—— > 配置屬性—— > 正常—— >MFC 的使用
選擇“在靜态庫中使用 MFC ”
圖表 8
10. 添加簡易代碼,隻作個最簡單的例子
10.1. 添加檔案頭,要添加到 test_mfc.cpp 頭部
#include <conio.h>
#include <fcntl.h>
#include <io.h>
#include <gtest/gtest.h>
圖表 9
10.2. 添加控制台類,用來顯示 gtest 測試資訊。直接寫在 test_mfc.cpp 中
class CConsole
{
public :
CConsole(void );
virtual ~CConsole(void );
private :
};
CConsole::CConsole(void )
{
AllocConsole();
int hCrun;
hCrun = _open_osfhandle((long )GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
FILE* hFile = _fdopen(hCrun, "w" );
// use default stream buffer
setvbuf(hFile, NULL, _IONBF, 0);
*stdout = *hFile;
//test
//_cprintf("test console by _cprintf/n", 0);
//std::cout << "test console by std::out/n";
}
CConsole::~CConsole(void )
{
FreeConsole();
}
10.3. 調用 gtest 測試,在 Ctest_mfcApp::InitInstance 中添加測試代碼
BOOL Ctest_mfcApp::InitInstance()
{
#if 1
CConsole cc;
int argc = 0;
TCHAR* argv = _T("" );
testing::GTEST_FLAG(output) = "xml:"; //加上這條則測試結果以xml格式儲存下來。儲存路徑可以修改,如"xml:d/"表示儲存到d:下
testing::InitGoogleTest(&argc, &argv);
RUN_ALL_TESTS();
HWND hwnd = GetConsoleWindow();
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
AfxMessageBox(_T("about to exit!" ));
return FALSE;
#endif
}
10.4. 編譯,結果如圖
圖表 10
11. 測試的例子
11.1 直接添加到 tset_mfc.cpp 中,不另建測試類
int func_check (int val = 0)
{
return val;
}
TEST(larg_name, wrong_test)
{
EXPECT_EQ( 10, func_check (15) );
}
TEST(larg_name, right_test)
{
EXPECT_EQ( 20, func_check (20) );
}
圖表 11
11.2 編譯
圖表 12
f:/download/gtest/test_mfc/test_mfc/test_mfc.cpp(143): error: Value of: func_check (15)
Actual: 15
Expected: 10
提示在 test_mfc.cpp 檔案 143 行的測試用例有錯, func_check 函數應該傳回 15 ,結果傳回 10 。
12. 結束