Параметризованный метод тестирования в Microsoft::VisualStudio::CppUnitTestFramework
Я пишу несколько тестов для моего C++ проекта, используя Microsoft::VisualStudio::CppUnitTestFramework. Здесь у меня есть случай, когда мне нужно запустить один и тот же тест с разными параметрами.
В Nunit Framework for CPP я могу добиться этого с помощью следующего кода.
[Test, SequentialAttribute]
void MyTest([Values("A", "B")] std::string s)
{
}
Передав эти параметры, этот тест будет выполнен 2 раза.
MyTest("A")
MyTest("B")
Есть ли аналогичный способ добиться этого в модульном тесте Microsoft::VisualStudio::CppUnitTestFramework.
Любая помощь высоко ценится.
1 ответ
CppUnitTestFramework не предусматривает параметризованные тесты, но ничто не мешает вам просто написать параметризованную функцию и вызвать ее из ваших тестов.
void MyTest(char *param)
{
// Actual test code here
}
TEST_METHOD(MyTest_ParamA)
{
MyTest("A");
}
TEST_METHOD(MyTest_ParamB)
{
MyTest("B");
}
Быстрое и простое решение:
Создайте вектор с вашими тестовыми примерами в TEST_METHOD_INITIALIZE, затем перебирайте вектор в каждом тестовом примере.
#include "stdafx.h"
#include "CppUnitTest.h"
#include <vector>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace SomeTests
{
TEST_CLASS(Some_Tests)
{
public:
std::vector<int> myTestCases;
TEST_METHOD_INITIALIZE(Initialize_Test_Cases)
{
myTestCases.push_back(1);
myTestCases.push_back(2);
myTestCases.push_back(3);
}
TEST_METHOD(Test_GreaterThanZero)
{
for (auto const& testCase : myTestCases)
{
Assert::IsTrue(testCase > 0);
}
}
};
}
У меня была похожая проблема: у меня есть интерфейс и несколько его реализаций. Конечно, я хочу писать тесты только для интерфейса. Кроме того, я не хочу копировать свои тесты для каждой реализации. Поэтому я искал способ передачи параметров в мой тест. Ну, мое решение не очень красивое, но оно простое и единственное, которое я придумал до сих пор.
Вот мое решение для моей проблемы (в вашем случае CLASS_UNDER_TEST будет параметром, который вы хотите передать в тест):
setup.cpp
#include "stdafx.h"
class VehicleInterface
{
public:
VehicleInterface();
virtual ~VehicleInterface();
virtual bool SetSpeed(int x) = 0;
};
class Car : public VehicleInterface {
public:
virtual bool SetSpeed(int x) {
return(true);
}
};
class Bike : public VehicleInterface {
public:
virtual bool SetSpeed(int x) {
return(true);
}
};
#define CLASS_UNDER_TEST Car
#include "unittest.cpp"
#undef CLASS_UNDER_TEST
#define CLASS_UNDER_TEST Bike
#include "unittest.cpp"
#undef CLASS_UNDER_TEST
unittest.cpp
#include "stdafx.h"
#include "CppUnitTest.h"
#define CONCAT2(a, b) a ## b
#define CONCAT(a, b) CONCAT2(a, b)
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
TEST_CLASS(CONCAT(CLASS_UNDER_TEST, Test))
{
public:
CLASS_UNDER_TEST vehicle;
TEST_METHOD(CONCAT(CLASS_UNDER_TEST, _SpeedTest))
{
Assert::IsTrue(vehicle.SetSpeed(42));
}
};
Вам нужно будет исключить "unittest.cpp" из сборки.