Microsoft.VisualStudio.TestTools.CppUnitTestFramework の使用

このトピックでは Microsoft::VisualStudio::CppUnitTestFramework の名前空間のパブリック メンバーの一覧を示します。

ヘッダー ファイルは VisualStudio2012[x86]InstallFolder\VC\UnitTest\include フォルダーにあります。

lib ファイルは VisualStudio2012[x86]InstallFolder\VC\UnitTest\lib フォルダーにあります。

このトピックの内容

CppUnitTest.h

CppUnitTest.h

テスト クラスとメソッドを作成する

TEST_CLASS(className)  

テスト メソッドを含む各クラスに必要です。 className をテスト クラスとして識別します。 TEST_CLASS は namescape のスコープで宣言する必要があります。

TEST_METHOD(methodName)   
{  
    // test method body  
}  

methodName をテスト メソッドとして定義します。 TEST_METHOD はメソッドのクラスのスコープ内で宣言する必要があります。

初期化とクリーンアップ

テスト メソッド

TEST_METHOD_INITIALIZE(methodName)   
{  
    // method initialization code  
}  

methodName を各テスト メソッドが実行される前に実行するメソッドとして定義します。 TEST_METHOD_INITIALIZE はテスト クラスで一度だけ定義でき、そのテスト クラスで定義する必要があります。

TEST_METHOD_CLEANUP(methodName)   
{  
    // test method cleanup  code  
}  

methodName を各テスト メソッドの実行後に実行するメソッドとして定義します。 TEST_METHOD_CLEANUP はテスト クラスで一度だけ定義でき、テスト クラスのスコープ内で定義する必要があります。

テスト クラス

TEST_CLASS_INITIALIZE(methodName)   
{  
    // test class initialization  code  
}  

methodName を各テスト クラスの作成後に実行するメソッドとして定義します。 TEST_CLASS_INITIALIZE はテスト クラスで一度だけ定義でき、テスト クラスのスコープ内で定義する必要があります。

TEST_CLASS_CLEANUP(methodName)   
{  
    // test class cleanup  code  
}  

methodName を各テスト クラスの作成後に実行するメソッドとして定義します。 TEST_CLASS_CLEANUP はテスト クラスで一度だけ定義でき、テスト クラスのスコープ内で定義する必要があります。

テスト モジュール

TEST_MODULE_INITIALIZE(methodName)  
{  
    // module initialization code  
}  

モジュールが読み込まれるときに実行するメソッド methodName を定義します。 TEST_MODULE_INITIALIZE はテスト モジュールで一度だけ定義でき、名前空間スコープで宣言する必要があります。

TEST_MODULE_CLEANUP(methodName)  

モジュールがアンロードされるときに実行するメソッド methodName を定義します。 TEST_MODULE_CLEANUP はテスト モジュールで一度だけ定義でき、名前空間スコープで宣言する必要があります。

テスト属性を作成する

テスト メソッドの属性

BEGIN_TEST_METHOD_ATTRIBUTE(testMethodName)   
    TEST_METHOD_ATTRIBUTE(attributeName, attributeValue)  
    ...  
END_TEST_METHOD_ATTRIBUTE()  

テスト メソッド testClassName に、TEST_METHOD_ATTRIBUTE の 1 つ以上のマクロで定義された属性を追加します。

TEST_METHOD_ATTRIBUTE マクロは名前 attributeName と値 attributeValue を持つ属性を定義します。

テスト クラス属性

BEGIN_TEST_CLASS_ATTRIBUTE(testClassName)   
    TEST_CLASS_ATTRIBUTE(attributeName, attributeValue)  
    ...  
END_TEST_CLASS_ATTRIBUTE()  

テスト クラス testClassName に、TEST_CLASS_ATTRIBUTE の 1 つ以上のマクロで定義された属性を追加します。

TEST_CLASS_ATTRIBUTE マクロは名前 attributeName と値 attributeValue を持つ属性を定義します。

テスト モジュール属性

BEGIN_TEST_MODULE_ATTRIBUTE(testModuleName)   
    TEST_MODULE_ATTRIBUTE(attributeName, attributeValue)  
    ...  
END_TEST_MODULE_ATTRIBUTE()  

テスト モジュール testModuleName に、TEST_MODULE_ATTRIBUTE の 1 つ以上のマクロで定義された属性を追加します。

TEST_MODULE_ATTRIBUTE マクロは名前 attributeName と値 attributeValue を持つ属性を定義します。

定義済みの属性

これらの定義済み属性マクロは、前に説明したマクロ TEST_METHOD_ATTRIBUTETEST_CLASS_ATTRIBUTE、または TEST_MODULE_ATTRIBUTE と置き換えることができます。

TEST_OWNER(ownerAlias)  

名前 Owner と属性値 ownerAlias を持つ属性を定義します。

TEST_DESCRIPTION(description)  

名前 Description と属性値 description を持つ属性を定義します。

TEST_PRIORITY(priority)  

名前 Priority と属性値 priority を持つ属性を定義します。

TEST_WORKITEM(workitem)  

名前 WorkItem と属性値 workItem を持つ属性を定義します。

TEST_IGNORE()  

名前 Ignore と属性値 true を持つ属性を定義します。

CppUnitTestAssert.h

一般的なアサート

等しい

2 つのオブジェクトが等しいことを確認します

template<typename T>   
static void AreEqual(  
    const T& expected,   
    const T& actual,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの倍精度小数点数が等しいことを確認します

static void AreEqual(  
    double expected,   
    double actual,   
    double tolerance,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの浮動小数点数が等しいことを確認します

static void AreEqual(  
    float expected,   
    float actual,   
    float tolerance,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの char* 文字列が等しいことを確認します

static void AreEqual(  
    const char* expected,   
    const char* actual,   
    bool ignoreCase = false,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの w_char* 文字列が等しいことを確認します

static void AreEqual(  
    const wchar_t* expected,   
    const wchar_t* actual,   
    bool ignoreCase = false,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

等しくない

2 つの倍精度小数点数が等しくないことを確認します

static void AreNotEqual(  
    double notExpected,   
    double actual,   
    double tolerance,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの浮動小数点数が等しくないことを確認します

static void AreNotEqual(  
    float notExpected,   
    float actual,   
    float tolerance,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの char* 文字列が等しくないことを確認します

static void AreNotEqual(  
    const char* notExpected,   
    const char* actual,   
    bool ignoreCase = false,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

2 つの w_char* 文字列が等しくないことを確認します

static void AreNotEqual(  
    const wchar_t* notExpected,   
    const wchar_t* actual,   
    bool ignoreCase = false,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

演算子 == に基づいて、2 つの参照が等しくないことを確認します

template<typename T>   
static void AreNotEqual(  
    const T& notExpected,   
    const T& actual,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

同じである

2 つの参照が同じオブジェクト インスタンス (ID) を参照していることを確認します。

template<typename T>   
static void AreSame(  
    const T& expected,   
    const T& actual,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

同じではない

2 つの参照が同じオブジェクト インスタンス (ID) を参照していないことを確認します。

template<typename T>   
static void AreNotSame (  
    const T& notExpected,   
    const T& actual,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

Null である

ポインターが NULL であることを確認します。

template<typename T>   
static void IsNull(  
    const T* actual,  
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

Null ではない

ポインターが NULL ではないことを確認します

template<typename T>   
static void IsNotNull(  
    const T* actual,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

True である

条件が true であることを確認します

static void IsTrue(  
    bool condition,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

False である

条件が false であることを確認します

static void IsFalse(  
    bool condition,   
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

失敗

テスト ケースの結果が失敗するよう強制します

static void Fail(  
    const wchar_t* message = NULL,   
    const __LineInfo* pLineInfo = NULL)  

Windows ランタイム アサート

等しい

2 つの Windows ランタイム ポインターが等しいことを確認します。

template<typename T>   
static void AreEqual(  
    T^ expected,   
    T^ actual,   
    Platform::String^ message = nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

2 つの Platform::String^ 文字列が等しいことを確認します。

template<typename T>   
static void AreEqual(  
    T^ expected,   
    T^ actual,   
    Platform::String^ message= nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

同じである

2 つの Windows ランタイム参照が同じオブジェクトを参照していることを確認します。

template<typename T>   
static void AreSame(  
    T% expected,   
    T% actual,   
    Platform::String^ message= nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

等しくない

2 つの Windows ランタイム ポインターが等しくないことを確認します。

template<typename T>   
static void AreNotEqual(  
    T^ notExpected,   
    T^ actual,   
    Platform::String^ message = nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

2 つの Platform::String^ 文字列が等しくないことを確認します。

static void AreNotEqual(  
    Platform::String^ notExpected,   
    Platform::String^ actual,   
    bool ignoreCase = false,   
    Platform::String^ message= nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

同じではない

2 つの Windows ランタイム参照が同じオブジェクトを参照していないことを確認します。

template<typename T>   
static void AreNotSame(  
    T% notExpected,   
    T% actual,   
    Platform::String^ message= nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

Null である

Windows ランタイム ポインターが nullptr であることを確認します。

template<typename T>   
static void IsNull(  
    T^ actual,  
    Platform::String^ message = nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

Null ではない

Windows ランタイム ポインターが nullptr ではないことを確認します。

template<typename T>   
static void IsNotNull(  
    T^ actual,   
    Platform::String^ message= nullptr,   
    const __LineInfo* pLineInfo= nullptr)  

例外アサート

例外を想定する

関数が例外を発生させることを確認します。

template<typename _EXPECTEDEXCEPTION, typename _FUNCTOR>   
static void ExpectException(  
    _FUNCTOR functor,   
    const wchar_t* message= NULL,   
    const __LineInfo* pLineInfo= NULL)  

関数が例外を発生させることを確認します。

template<typename _EXPECTEDEXCEPTION, typename _RETURNTYPE>   
    static void ExpectException(  
    _RETURNTYPE (*func)(),   
    const wchar_t* message= NULL,   
    const __LineInfo* pLineInfo = NULL)  

CppUnitTestLogger.h

Logger

ロガー クラスには書き込みを行うための静的メソッドが含まれます

class Logger  

メッセージの書き込み

static void   
Logger::WriteMessage(const wchar_t* message)  
static void   
Logger::WriteMessage(const char* message)  

以下のコードは一例です

////////////////////////////////////////////////////////////  
/* USAGE EXAMPLE  
// The following is an example of VSCppUnit usage.  
// It includes examples of attribute metadata, fixtures,  
// unit tests with assertions, and custom logging.  

#include <CppUnitTest.h>  

using namespace Microsoft::VisualStudio::CppUnitTestFramework;  

BEGIN_TEST_MODULE_ATTRIBUTE()  
    TEST_MODULE_ATTRIBUTE(L"Date", L"2010/6/12")  
END_TEST_MODULE_ATTRIBUTE()  

TEST_MODULE_INITIALIZE(ModuleInitialize)  
{  
    Logger::WriteMessage("In Module Initialize");  
}  

TEST_MODULE_CLEANUP(ModuleCleanup)  
{  
    Logger::WriteMessage("In Module Cleanup");  
}  

TEST_CLASS(Class1)  
{  

public:  

    Class1()  
    {  
        Logger::WriteMessage("In Class1");  
    }  

    ~Class1()  
    {  
        Logger::WriteMessage("In ~Class1");  
    }  

    TEST_CLASS_INITIALIZE(ClassInitialize)  
    {  
        Logger::WriteMessage("In Class Initialize");  
    }  

    TEST_CLASS_CLEANUP(ClassCleanup)  
    {  
        Logger::WriteMessage("In Class Cleanup");  
    }  

    BEGIN_TEST_METHOD_ATTRIBUTE(Method1)  
        TEST_OWNER(L"OwnerName")  
        TEST_PRIORITY(1)  
    END_TEST_METHOD_ATTRIBUTE()  

    TEST_METHOD(Method1)  
    {     
        Logger::WriteMessage("In Method1");  
        Assert::AreEqual(0, 0);  
    }  

    TEST_METHOD(Method2)  
    {  
        Assert::Fail(L"Fail");  
    }  
};  

関連項目

コードの単体テスト
テスト エクスプローラーを使用したネイティブ コードの単体テスト
既存の C++ アプリケーションへの単体テストの追加