2016-04-28 41 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,它終於工作。