天天看点

gtest测试MFC项目

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 。确认。

gtest测试MFC项目

图表 1

gtest测试MFC项目

图表 2

gtest测试MFC项目

图表 3

6.         复制 gtest 头文件 gtest-1.5.0/include 文件夹及库 gtestd.lib   gtest.lib 到 MFC 测试工程中

gtest测试MFC项目

图表 4

7.         将在 MFC 工程中指明 gtestd.lib 路径与 include 文件夹路径

项目—— > 属性—— > 配置属性—— >c/c++ —— > 常规—— > 附加包含项目

设置 gtest 头文件路径为 F:/download/gtest/test_mfc/include

gtest测试MFC项目

图表 5

项目—— > 属性—— > 配置属性—— > 连接器—— > 输入—— > 附加依赖项

       设置 gtest.lib 库路径 F:/download/gtest/test_mfc/gtestd.lib

gtest测试MFC项目

图表 6

8.         设置运行模式

项目—— > 属性—— > 配置属性—— >c/c++ —— > 代码生成—— > 运行时库—— > 多线程调试 (/MTd)

gtest测试MFC项目

图表 7

9.         项目—— > 属性—— > 配置属性—— > 常规—— >MFC 的使用

选择“在静态库中使用 MFC ”

gtest测试MFC项目

图表 8

10.     添加简易代码,只作个最简单的例子

10.1.     添加文件头,要添加到 test_mfc.cpp 头部

#include <conio.h>  

#include <fcntl.h>  

#include <io.h>  

#include <gtest/gtest.h>

gtest测试MFC项目

图表 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.     编译,结果如图

gtest测试MFC项目

图表 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) );

}

gtest测试MFC项目

图表 11

11.2  编译

gtest测试MFC项目

图表 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.     结束