Microsoft.VisualStudio.TestTools.CppUnitTestFramework API リファレンス

このトピックでは Microsoft::VisualStudio::CppUnitTestFramework の名前空間のパブリック メンバーの一覧を示します。 Microsoft ネイティブ単体テスト フレームワークに基づいて C++ の単体テストを作成するには、これらの API を使います。 トピックの最後には「使用例」があります。

ヘッダーと lib のファイルは <Visual Studio インストール フォルダー>\VC\Auxiliary\VS\UnitTest にあります。

ヘッダーと lib のパスは、ネイティブ テスト プロジェクトで自動的に構成されます。

このトピックの内容

CppUnitTest.h

CppUnitTest.h

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

TEST_CLASS(className)

テスト メソッドを含む各クラスに必要です。 className をテスト クラスとして識別します。 TEST_CLASS は名前空間範囲で宣言する必要があります。

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()

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

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_ATTRIBUTE の代わりに使用できます。

TEST_OWNER(ownerAlias)

名前 Owner と属性値 ownerAliasTEST_METHOD_ATTRIBUTE を定義します。

TEST_DESCRIPTION(description)

名前 Description と属性値 descriptionTEST_METHOD_ATTRIBUTE を定義します。

TEST_PRIORITY(priority)

名前 Priority と属性値 priorityTEST_METHOD_ATTRIBUTE を定義します。

TEST_WORKITEM(workitem)

名前 WorkItem と属性値 workItemTEST_METHOD_ATTRIBUTE を定義します。

TEST_IGNORE()

名前 Ignore と属性値 trueTEST_METHOD_ATTRIBUTE を定義します。

CppUnitTestAssert.h

一般的なアサート

等しい

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

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

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

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

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

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

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

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

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

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

等しくない

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

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

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

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

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

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

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

static void Assert::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 Assert::AreNotEqual(
    const T& notExpected,
    const T& actual,
    const wchar_t* message = NULL,
    const __LineInfo* pLineInfo = NULL)

同じである

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

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

同じではない

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

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

Null である

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

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

Null ではない

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

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

True である

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

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

False である

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

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

失敗

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

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

Windows ランタイム アサート

等しい

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

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

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

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

同じである

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

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

等しくない

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

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

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

static void Assert::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 Assert::AreNotSame(
    T% notExpected,
    T% actual,
    Platform::String^ message= nullptr,
    const __LineInfo* pLineInfo= nullptr)

Null である

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

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

Null ではない

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

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

例外アサート

例外を想定する

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

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

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

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

CppUnitTestLogger.h

ロガー

ロガー クラスには、出力ウィンドウに書き込むための静的メソッドが含まれます。

メッセージの書き込み

出力ウィンドウに文字列を書き込む

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

以下のコードは VSCppUnit の使用例です。 属性メタデータ、フィクスチャ、アサーションのある単体テスト、およびカスタム ログの例が含まれます。

// USAGE EXAMPLE

#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");
    }
};

関連項目