2016-04-28 71 views
2

我是新的TDD的想法。我以前没有使用任何测试框架。最近我已经开始阅读关于它和谷歌测试练习。 我的目标是在MFC中开发的遗留代码库中启动TDD。大多数情况下,我必须使用GUI控件 - 开发新的自定义控件,为现有的自定义控件添加功能等。所以,我想自动化GUI类的测试,这些GUI类主要来自CWnd类。如何使用谷歌测试/模拟测试基于MFC CWnd的类?

我在Visual Studio中创建了一个用于测试的win32控制台项目,同时创建了一个项目,我在'Add common header files for'选项中勾选了MFC。 Visual Studio项目向导已经生成了主函数并创建了一个CWinApp对象。在主函数中,我添加了谷歌测试的样板代码。我将实际的项目(即要测试的)和谷歌测试(和模拟)库编译为.lib并将其链接到测试项目。我已经成功构建了测试项目。我可以从项目中测试简单的东西。

这是向导生成的代码(包括谷歌测试样板代码) -

#include "stdafx.h" 
#include "TestMFC.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

// The one and only application object 
CWinApp theApp; 
using namespace std; 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 

    HMODULE hModule = ::GetModuleHandle(NULL); 

    if (hModule != NULL) 
    { 
     // initialize MFC and print and error on failure 
     if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) 
     { 
      // TODO: change error code to suit your needs 
      _tprintf(_T("Fatal Error: MFC initialization failed\n")); 
      nRetCode = 1; 
     } 
     else 
     { 
      // TODO: code your application's behavior here. 
       testing::InitGoogleMock(&argc, argv); 
       nRetCode = RUN_ALL_TESTS(); 
     } 
    } 
    else 
    { 
     // TODO: change error code to suit your needs 
     _tprintf(_T("Fatal Error: GetModuleHandle failed\n")); 
     nRetCode = 1; 
    } 
    return nRetCode; 
} 

我面临的挑战是我不能创建实际的窗口,这将需要有消息循环。我想模拟CWnd,以便根据已知的假设测试特征。但是,我找不到一种方法来模拟CWnd,因为它有一些非虚拟成员函数依赖于HWND。 HWND仅在创建窗口时有效。另一个挑战是消息处理程序不是虚函数。所以我不能模拟消息处理程序,也不能创建窗口,不能将消息路由到它的处理程序。

我需要思考如何才能解决问题。我可以做到这一点,而不用模拟或其他东西创建实际的窗口?或者我可以创建窗口和路由消息?

在此先感谢。

回答

1

我建议使用Visual Studio编码的UI测试自动化套件。它比Google Mock好得多。 Visual Studio编码的UI测试本身支持MFC/Win32 GUI的东西。

+0

我已经看到编码的用户界面,但我不想模拟一些用户操作。要做到这一点,我们有质量保证工程师。我想做开发者部分,这是单元测试。我想确保每个单元都正常工作。最重要的是我的目的是引入TDD(测试驱动开发)和重构遗留代码。对于这个单元测试是由一些相关书籍的作者推荐的。 – army007

+0

Visual Studio附带**单元测试框架**。所以不需要安装第三方。您可以将Coded UI和单元测试框架结合起来,以取得理想的效果。 –

0

测试MFC应用程序时出现问题,因为大多数函数未导出。所以我们应该在GTEST项目中包含我们的源代码,并将它与MFC运行时链接起来。这是棘手的部分。我已使用VS2017“测试适配器的谷歌测试”与NuGet包:“googletest.v140.windesktop.static.rt-dyn”my project,它终于工作。