2016-04-28 222 views
2

私はTDDのアイデアで新しいです。以前はテストフレームワークを使っていませんでした。最近、私はそれについて読んで、Googleのテストで練習し始めました。 私の目標は、MFCで開発されたレガシーコードベースでTDDを開始することです。ほとんどの場合、GUIコントロールで作業する必要があります。新しいカスタムコントロールを開発したり、既存のカスタムコントロールなどに機能を追加したりする必要があります。そのため、ほとんどの場合CWndクラスから派生したGUIクラスのテストを自動化します。google test/mockを使用してMFC CWndベースのクラスをテストするには?

Visual Studioでテスト用のWin32コンソールプロジェクトを作成しましたが、プロジェクトを作成する際に「Add common header files for」オプションでMFCにチェックを入れました。 Visual Studioプロジェクトウィザードがmain関数を生成し、CWinAppオブジェクトを作成しました。主な機能では、私はgoogleのテストのための定型句のコードを追加しました。実際のプロジェクト(テスト対象)とGoogleテスト(および模擬)ライブラリを.libとしてコンパイルし、テストプロジェクトにリンクしました。私はテストプロジェクトを正常に構築しました。私はプロジェクトから簡単なことをテストすることができます。 (Googleのテスト定型的なコードが含まれています)のコードを生成した。ここ

はウィザードです -

#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を模倣して、知っている前提に基づいて機能をテストできるようにしたいと思っていました。しかし、私はHWNDに依存する非仮想メンバ関数をいくつか持っているので、CWndを模倣する方法を見つけることはできません。 HWNDは、ウィンドウを作成した場合にのみ有効です。別の課題は、メッセージハンドラが仮想関数ではないことです。だから私はメッセージハンドラを模擬することができず、ウィンドウを作成せずにメッセージをハンドラにルーティングすることはできません。

私はこの問題を解決するためにどのように取り組むべきかについての考えが必要です。私は実際の窓を擬似的に作成せずにそれを行うことはできますか?または、ウィンドウとルートメッセージを作成できますか?

ありがとうございます。

答えて

1

Visual Studioコード化UIテストオートメーションスイートを使用することをお勧めします。それはGoogle Mockよりはるかに優れています。 Visual Studioのコード化されたUIテストは、ネイティブにMFC/Win32 GUIのものをサポートしています。

+0

私はコード化されたUIを見たことがありますが、私は実際にはユーザーアクションをシミュレートしたくありません。そのためにはQAエンジニアがいます。私はユニットテストである開発者の部分をしたい。私はすべてのユニットが適切に働いていることを確認したい。最も重要なのは私の目的はTDD(Test Driven Development)を導入し、レガシーコードをリファクタリングすることです。そのユニットテストのために、いくつかの関連書籍の著者によって推薦される。 – army007

+0

Visual Studioには** Unit Testing Framework **が付属しています。したがって、サードパーティをインストールする必要はありません。コード化されたUIとユニットテストフレームワークの両方を組み合わせて、素晴らしい結果を達成できます。 –

0

ほとんどの関数がエクスポートされないため、MFCアプリケーションのテストに問題があります。 GTESTプロジェクトでソースを組み込み、MFCランタイムにリンクする必要があります。そして、これは難しい部分です。私はVS2017 "Test Adapter for Google Test"をNuGetパッケージで使用しました: "googletest.v140.windesktop.static.rt-dyn"はmy projectであり、最終的に動作します。

関連する問題