Dokumentacja interfejsu API Microsoft.VisualStudio.TestTools.CppUnitTestFramework

W tym temacie wymieniono publicznych członków Microsoft::VisualStudio::CppUnitTestFramework przestrzeni nazw. Użyj tych interfejsów API, aby napisać testy jednostkowe języka C++ na podstawie platformy Microsoft Native Unit Test Framework. Na końcu tematu znajduje się przykład użycia.

Pliki nagłówka i biblioteki znajdują się w <folderze> instalacyjnym programu Visual Studio\VC\Auxiliary\VS\UnitTest.

Ścieżki nagłówków i bibliotek są automatycznie konfigurowane w projekcie testowym natywnym.

W tym temacie

CppUnitTest.h

CppUnitTest.h

Tworzenie klas i metod testowych

TEST_CLASS(className)

Wymagane dla każdej klasy zawierającej metody testowe. Identyfikuje klasę className jako klasę testową. TEST_CLASS należy zadeklarować w zakresie przestrzeni nazw.

TEST_METHOD(methodName)
{
    // test method body
}

Definiuje metodę methodName jako metodę testową. TEST_METHOD należy zadeklarować w zakresie klasy metody.

Inicjowanie i oczyszczanie

Metody testowania

TEST_METHOD_INITIALIZE(methodName)
{
    // method initialization code
}

Definiuje methodName jako metodę uruchamianą przed uruchomieniem każdej metody testowej. TEST_METHOD_INITIALIZE można zdefiniować tylko raz w klasie testowej i muszą być zdefiniowane w zakresie klasy testowej.

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

Definiuje methodName jako metodę uruchamianą po uruchomieniu każdej metody testowej. TEST_METHOD_CLEANUP można zdefiniować tylko raz w klasie testowej i muszą być zdefiniowane w zakresie klasy testowej.

Klasy testowe

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

Definiuje methodName jako metodę uruchamianą przed utworzeniem każdej klasy testowej. TEST_CLASS_INITIALIZE można zdefiniować tylko raz w klasie testowej i muszą być zdefiniowane w zakresie klasy testowej.

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

Definiuje methodName jako metodę uruchamianą po utworzeniu każdej klasy testowej. TEST_CLASS_CLEANUP można zdefiniować tylko raz w klasie testowej i muszą być zdefiniowane w zakresie klasy testowej.

Moduły testowe

TEST_MODULE_INITIALIZE(methodName)
{
    // module initialization code
}

Definiuje metodę methodName uruchamianą po załadowaniu modułu. TEST_MODULE_INITIALIZE można zdefiniować tylko raz w module testowym i musi być zadeklarowany w zakresie przestrzeni nazw.

TEST_MODULE_CLEANUP(methodName)

Definiuje metodę methodName uruchamianą podczas zwalniania modułu. TEST_MODULE_CLEANUP można zdefiniować tylko raz w module testowym i musi być zadeklarowany w zakresie przestrzeni nazw.

Tworzenie atrybutów testowych

Atrybuty metody testowej

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

Dodaje atrybuty zdefiniowane za pomocą co najmniej jednego TEST_METHOD_ATTRIBUTE makra do metody testowej testMethodName.

Makro TEST_METHOD_ATTRIBUTE definiuje atrybut o nazwie attributeName i value attributeValue.

Atrybuty klasy testowej

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

Dodaje atrybuty zdefiniowane przy użyciu co najmniej jednego TEST_CLASS_ATTRIBUTE makra do klasy testClassName.

Makro TEST_CLASS_ATTRIBUTE definiuje atrybut o nazwie attributeName i value attributeValue.

Atrybuty modułu testowego

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

Dodaje atrybuty zdefiniowane przy użyciu co najmniej jednego TEST_MODULE_ATTRIBUTE makra do testowego modułu testModuleName.

Makro TEST_MODULE_ATTRIBUTE definiuje atrybut o nazwie attributeName i value attributeValue.

Wstępnie zdefiniowane atrybuty

Te wstępnie zdefiniowane makra atrybutów są udostępniane jako wygoda w typowych przypadkach. Można je zastąpić makrem TEST_METHOD_ATTRIBUTE opisanym powyżej.

TEST_OWNER(ownerAlias)

Definiuje element TEST_METHOD_ATTRIBUTE o nazwie Owner i wartości atrybutu ownerAlias.

TEST_DESCRIPTION(description)

Definiuje element TEST_METHOD_ATTRIBUTE o nazwie Description i wartości atrybutu opisu.

TEST_PRIORITY(priority)

Definiuje element TEST_METHOD_ATTRIBUTE o nazwie Priority i wartości atrybutu priorytetu.

TEST_WORKITEM(workitem)

Definiuje element TEST_METHOD_ATTRIBUTE o nazwie WorkItem i wartości atrybutu workItem.

TEST_IGNORE()

Definiuje element TEST_METHOD_ATTRIBUTE o nazwie Ignore i wartości atrybutu true.

CppUnitTestAssert.h

Potwierdzenia ogólne

Są równe

Sprawdź, czy dwa obiekty są równe

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

Sprawdź, czy dwa podwójne są równe

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

Sprawdź, czy dwa zmiennoprzecinki są równe

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

Sprawdź, czy dwa ciągi znaków* są równe

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

Sprawdź, czy dwa ciągi w_char* są równe

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

Nie są równe

Sprawdź, czy dwa podwojenia nie są równe

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

Sprawdź, czy dwa zmiennoprzecinki nie są równe

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

Sprawdź, czy dwa ciągi znaków* nie są równe

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

Sprawdź, czy dwa ciągi w_char* nie są równe

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

Sprawdź, czy dwa odwołania nie są równe na podstawie operatora==.

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

Są takie same

Sprawdź, czy dwa odwołania odwołują się do tego samego wystąpienia obiektu (tożsamości).

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

Nie są takie same

Sprawdź, czy dwa odwołania nie odwołują się do tego samego wystąpienia obiektu (tożsamości).

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

Ma wartość null

Sprawdź, czy wskaźnik ma wartość NULL.

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

Nie ma wartości null

Sprawdź, czy wskaźnik nie ma wartości NULL

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

Jest prawdziwe

Sprawdź, czy warunek ma wartość true

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

Jest fałszem

Sprawdź, czy warunek ma wartość false

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

Niepowodzenie

Wymuszanie niepowodzenia wyniku przypadku testowego

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

asercyjnie środowisko wykonawcze systemu Windows

Są równe

Sprawdza, czy dwa wskaźniki środowisko wykonawcze systemu Windows są równe.

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

Sprawdza, czy dwa ciągi Platform::String^ są równe.

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

Są takie same

Sprawdza, czy dwa środowisko wykonawcze systemu Windows odwołania odwołują się do tego samego obiektu.

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

Nie są równe

Sprawdza, czy dwa wskaźniki środowisko wykonawcze systemu Windows nie są równe.

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

Sprawdza, czy dwa ciągi Platform::String^ nie są równe.

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

Nie są takie same

Sprawdza, czy dwa odwołania środowisko wykonawcze systemu Windows nie odwołują się do tego samego obiektu.

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

Ma wartość null

Sprawdza, czy wskaźnik środowisko wykonawcze systemu Windows jest wartością nullptr.

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

Nie ma wartości null

Sprawdza, czy wskaźnik środowisko wykonawcze systemu Windows nie jest elementem nullptr.

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

Potwierdzenia wyjątków

Oczekiwano wyjątku

Sprawdź, czy funkcja zgłasza wyjątek:

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

Sprawdź, czy funkcja zgłasza wyjątek:

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

CppUnitTestLogger.h

Rejestratora

Klasa Rejestrator zawiera metody statyczne do zapisu w oknie danych wyjściowych.

Napisz wiadomość

Zapisywanie ciągu w oknie danych wyjściowych

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

Przykład

Ten kod jest przykładem użycia narzędzia VSCppUnit. Zawiera przykłady metadanych atrybutów, urządzeń, testów jednostkowych z asercji i rejestrowania niestandardowego.

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

Zobacz też