使用 Microsoft.VisualStudio.TestTools.CppUnitTestFramework
本主題列出 Microsoft::VisualStudio::CppUnitTestFramework 命名空間的公用成員。
標頭檔位於 VisualStudio2012[x86]InstallFolder**\VC\UnitTest\include** 資料夾。
LIB 檔案位於 VisualStudio2012[x86]InstallFolder**\VC\UnitTest\lib** 資料夾。
本主題內容
CppUnitTest.h
建立測試類別和方法
初始化並清除
測試方法。
測試類別
測試模組
建立測試屬性
測試方法屬性
測試類別屬性
測試模組屬性
預先定義的屬性。
CppUnitTestAssert.h
一般判斷提示
相等
不相等
相同。
不相同。
為 Null。
不是 Null。
為 True。
為 False。
失敗
在執行階段判斷提示
相等
相同。
不相等
不相同。
為 Null。
不是 Null。
例外狀況判斷提示
- 預期的例外狀況。
CppUnitTestLogger.h
記錄器
寫入訊息
CppUnitTest.h
建立測試類別和方法
TEST_CLASS(className)
要求包含測試方法的每一個類別。 識別 className 做為測試類別。 必須在 namescape 範圍宣告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()
將屬性定義為一或多個 TEST_METHOD_ATTRIBUTE 巨集,並加入至測試方法 testClassName。
TEST_METHOD_ATTRIBUTE 巨集定義使用名稱 attributeName 和值 attributeValue的屬性。
測試類別屬性
BEGIN_TEST_CLASS_ATTRIBUTE(testClassName)
TEST_CLASS_ATTRIBUTE(attributeName, attributeValue)
...
END_TEST_CLASS_ATTRIBUTE()
將定義為一或多個 TEST_CLASS_ATTRIBUTE 巨集的屬性加入至測試類別 testClassName。
TEST_CLASS_ATTRIBUTE 巨集定義使用名稱 attributeName 和值 attributeValue的屬性。
測試模組屬性
BEGIN_TEST_MODULE_ATTRIBUTE(testModuleName)
TEST_MODULE_ATTRIBUTE(attributeName, attributeValue)
...
END_TEST_MODULE_ATTRIBUTE()
將定義為一或多個 TEST_MODULE_ATTRIBUTE 巨集的屬性加入至測試模組 testModuleName。
TEST_MODULE_ATTRIBUTE 巨集定義使用名稱 attributeName 和值 attributeValue的屬性。
預先定義的屬性。
這些預先定義的屬性巨集可以用巨集 TEST_METHOD_ATTRIBUTE、 TEST_CLASS_ATTRIBUTE或上方所描述的 TEST_MODULE_ATTRIBUTE 替代。
TEST_OWNER(ownerAlias)
定義使用名稱 Owner 且屬性值為 ownerAlias的屬性。
TEST_DESCRIPTION(description)
定義使用名稱Description 且屬性值為 描述的屬性。
TEST_PRIORITY(priority)
定義使用名稱 Priority 且屬性值為 優先順序的屬性。
TEST_WORKITEM(workitem)
定義使用名稱 WorkItem 且屬性值為workItem的屬性。
TEST_IGNORE()
定義使用名稱 Ignore 且屬性值為 true的屬性。
CppUnitTestAssert.h
一般判斷提示
相等
驗證兩個物件相等
template<typename T>
static void AreEqual(
const T& expected,
const T& actual,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個雙精度浮點數相等
static void AreEqual(
double expected,
double actual,
double tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個浮點數相等
static void AreEqual(
float expected,
float actual,
float tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個字串相等 char*
static void AreEqual(
const char* expected,
const char* actual,
bool ignoreCase = false,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個 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)
不相等
驗證兩個雙精度浮點數不相等
static void AreNotEqual(
double notExpected,
double actual,
double tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個浮點數不相等
static void AreNotEqual(
float notExpected,
float actual,
float tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個 char*字串不相等
static void AreNotEqual(
const char* notExpected,
const char* actual,
bool ignoreCase = false,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
驗證兩個 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)
根據運算子==,驗證兩個不相等的參考。
template<typename T>
static void AreNotEqual(
const T& notExpected,
const T& actual,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
相同。
驗證兩個參考是否參考相同的物件執行個體 (識別)。
template<typename T>
static void AreSame(
const T& expected,
const T& actual,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)
不相同。
驗證兩個參考並未參考相同的物件執行個體 (識別)。
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 執行階段指標相等。
template<typename T>
static void AreEqual(
T^ expected,
T^ actual,
Platform::String^ message = nullptr,
const __LineInfo* pLineInfo= nullptr)
驗證兩個 Platform::String^字串相等。
template<typename T>
static void AreEqual(
T^ expected,
T^ actual,
Platform::String^ message= nullptr,
const __LineInfo* pLineInfo= nullptr)
相同。
驗證兩個 Windows 執行階段參考相同的物件。
template<typename T>
static void AreSame(
T% expected,
T% actual,
Platform::String^ message= nullptr,
const __LineInfo* pLineInfo= nullptr)
不相等
驗證兩個 Windows 執行階段指標不相等。
template<typename T>
static void AreNotEqual(
T^ notExpected,
T^ actual,
Platform::String^ message = nullptr,
const __LineInfo* pLineInfo= nullptr)
驗證兩個 Platform::String^字串不相等。
static void AreNotEqual(
Platform::String^ notExpected,
Platform::String^ actual,
bool ignoreCase = false,
Platform::String^ message= nullptr,
const __LineInfo* pLineInfo= nullptr)
不相同。
驗證兩個 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
記錄器
記錄器類別包含靜態方法寫至。
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");
}
};