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