Я устанавливаю набор модульных тестов для некоторого неуправляемого кода C ++, и у меня есть несколько вопросов.
Я добавил проект в свое решение с Visual C++
→ Test
→ Native Unit Test Project
,
Чтобы выяснить, как все сгруппировано в этой тестовой среде и когда выполняется инициализация, я заменил содержимое исходного файла (unittest1.cpp
) с измененной версией USAGE EXAMPLE
с вершины CppUnitTest.h:
#include <CppUnitTest.h>
#include <string>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using std::string;
BEGIN_TEST_MODULE_ATTRIBUTE()
TEST_MODULE_ATTRIBUTE(L"Date", L"2010/6/12")
END_TEST_MODULE_ATTRIBUTE()static string Indent("");
void openBlock()
{
Logger::WriteMessage((Indent + "{").c_str());
Indent += " ";
}
void closeBlock()
{
Indent.resize(Indent.size() >= 2 ? (Indent.size() - 2) : 0);
Logger::WriteMessage((Indent + "}").c_str());
}TEST_MODULE_INITIALIZE(ModuleInitialize)
{
Logger::WriteMessage((Indent + "In Module Initialize").c_str());
openBlock();
}
TEST_MODULE_CLEANUP(ModuleCleanup)
{
closeBlock();
Logger::WriteMessage((Indent + "In Module Cleanup").c_str());
}TEST_CLASS(Class1)
{
public:
Class1()
{
Logger::WriteMessage((Indent + "In Class1").c_str());
openBlock();
}
~Class1()
{
closeBlock();
Logger::WriteMessage((Indent + "In ~Class1").c_str());
}TEST_CLASS_INITIALIZE(ClassInitialize)
{
Logger::WriteMessage((Indent + "In Class Initialize").c_str());
openBlock();
}
TEST_CLASS_CLEANUP(ClassCleanup)
{
closeBlock();
Logger::WriteMessage((Indent + "In Class Cleanup").c_str());
}BEGIN_TEST_METHOD_ATTRIBUTE(Method1)
TEST_OWNER(L"OwnerName")
TEST_PRIORITY(1)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(Method1)
{
Logger::WriteMessage((Indent + "In Method1").c_str());
Assert::AreEqual(0, 0);
}
TEST_METHOD(Method2)
{
Logger::WriteMessage((Indent + "In Method2").c_str());
Assert::Fail(L"Fail");
Logger::WriteMessage("This won't print due to failure above.");
}
};
Он генерирует вывод ниже. (Я добавил некоторые разрывы строк для ясности.)
In Module Initialize
{
In Class Initialize
{
In Class1
{
In Method1
}
In ~Class1
In Class1
{
In Method2
}
In ~Class1
}
In Class Cleanup
}
In Module Cleanup
Из этого я делаю вывод:
TEST_MODULE
содержит ноль или более TEST_CLASS
эс.TEST_CLASS
содержит ноль или более TEST_METHOD
s.TEST_MODULE_INITIALIZE()
а также TEST_MODULE_CLEANUP()
запускаются один раз для каждого TEST_MODULE
до / после своей серии TEST_CLASS
они выполнены.TEST_CLASS_INITIALIZE()
а также TEST_CLASS_CLEANUP()
запускаются один раз для каждого TEST_CLASS
до / после своей серии TEST_METHOD
s выполнены.TEST_METHOD
является примером TEST_CLASS
, Конструктор класса выполняется непосредственно перед TEST_METHOD()
и деструктор класса выполняется сразу после TEST_METHOD()
,TEST_MODULE
на исходный файл? Может TEST_MODULE
быть разделены между несколькими исходными файлами? Что такое лучшая практика?TEST_CLASS
за файл или TEST_MODULE
? Есть ли лучшие практики в этом отношении?ATTRIBUTE
s? Как они используются?Задача ещё не решена.
Других решений пока нет …