17

VisualC++プロジェクトの単体テストを作成したいと思います。これらのMSDNの指示に従ってみました。管理されていない/混合された/純粋なコードを区別するページを見つけましたが、それらの概念を完全には理解していません。私のコードは.NETを使用しておらず、いくつかのコード調整を行ってMinGWでコンパイルする可能性があります。

私のメインプロジェクトは実行可能ファイルをビルドするので、「テストプロジェクトからエクスポートされた関数を参照するには」の手順に従いました。手始めに、私はさまざまなプロジェクトオプションを手に入れました:

ネイティブユニットテストプロジェクトに参加しました。メインプロジェクトへの参照を追加し、 [ディレクトリを含める]$(SolutionDir)\Cubes;$(IncludePath)をに設定しました。私は自分のコードを書き、コンパイル時にこれを取得しました:

1>Creating library C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.lib and object C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.exp
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Room::Room(void)" (??0Room@@QAE@XZ) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Layout::Layout(class Room *,int)" (??0Layout@@QAE@PAVRoom@@H@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::add(int,int,class Room *)" (?add@Layout@@QAEXHHPAVRoom@@@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" (?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ)
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::clear(int,int,bool)" (?clear@Layout@@QAEXHH_N@Z) referenced in function __catch$?NumOfRoomsConsistency@LayoutTest@CubesTest@@QAEXXZ$0
1>C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.dll : fatal error LNK1120: 4 unresolved externals

私が間違っていなければ、これはコンパイラがヘッダーファイルを検出するが、ソースファイルは検出しないことを意味します。私は何が欠けていますか?

4

1 に答える 1

15

単体テストのターゲットとして EXE を追加する方法について、順を追って説明します。

重要なポイントは、テストしたい関数/クラスを「エクスポート」することです...完全なサンプルをここからダウンロードできます: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip (私はプロジェクト設定を変更していません) 、ソースコードで見ることができるすべての変更; もちろん、いくつかの部分はプロジェクト設定で行うことができます)。

  1. Win32 アプリケーションを作成します (コンソール、MFC、または Windows は関係ありません)。というコンソールプロジェクトを作成しましたCPP_UnitTestApp

  2. テストする関数を追加します (クラスを追加することもできます)。例えば:

    int Plus1(int i)
    {
      return i+1;
    }
    
  3. テストする関数のヘッダー ファイルを追加します。CPP_UnitTestApp.h

  4. メソッドの宣言をヘッダー ファイルに入れ、これらの関数もエクスポートします。

    #pragma once
    
    #ifdef EXPORT_TEST_FUNCTIONS
    
    #define MY_CPP_UNITTESTAPP_EXPORT __declspec(dllexport)
    #else
    #define MY_CPP_UNITTESTAPP_EXPORT
    #endif
    
    MY_CPP_UNITTESTAPP_EXPORT int Plus1(int i);
    
  5. このヘッダー ファイルを main-cpp (ここでは CPP_UnitTestApp.cpp) にインクルードし、ヘッダーをインクルードするEXPORT_TEST_FUNCTIONS前に を定義します。

    #define EXPORT_TEST_FUNCTIONS
    #include "CPP_UnitTestApp.h"
    
  6. 新しいプロジェクトを追加します (ネイティブ単体テスト プロジェクト: UnitTest1)

  7. ヘッダーと lib を「unittest1.cpp」ファイルに含めます (必要に応じてパスを採用します)。

    #include "..\CPP_UnitTestApp.h"
    #pragma comment(lib, "../Debug/CPP_UnitTestApp.lib")
    
  8. テスト プロジェクトのプロジェクト設定に移動し、「UnitTest1」プロジェクトへの参照を追加します (プロジェクト|プロパティ|共通プロパティ|新しい参照の追加...:「プロジェクト」の下で「CPP_UnitTestApp」プロジェクトを選択します)。

  9. 単体テスト関数を作成します。

    TEST_METHOD(TestMethod1)
    {
      int res = Plus1(12);
      Assert::AreEqual(13, res);
    }
    
  10. 単体テストを実行してください ;)

ご覧のとおり、主なポイントは関数宣言をエクスポートすることでした! __declspec(dllexport)これは、EXE であっても経由で行われます。

前述したように、デモ プロジェクトはhttp://blog.kalmbachnet.de/files/CPP_UnitTestApp.zipからダウンロードできます。

于 2013-07-22T08:33:35.483 に答える