我正在使用 Microsoft :: VisualStudio :: CppUnitTestFramework 为我的C ++项目编写一些测试用例。在这里,我有一个案例,我必须运行具有不同参数的相同测试用例。
在Nunit Framework for CPP中,我可以通过以下代码实现这一目标。
[Test, SequentialAttribute]
void MyTest([Values("A", "B")] std::string s)
{
}
通过传递这些参数,此测试将运行2次。
MyTest("A")
MyTest("B")
在 Microsoft :: VisualStudio :: CppUnitTestFramework 单元测试中是否有类似的方法来实现此目的。
非常感谢任何帮助。
答案 0 :(得分:1)
CppUnitTestFramework不提供参数化测试,但是没有什么可以阻止您简单地编写参数化函数并从测试中调用它。
void MyTest(char *param)
{
// Actual test code here
}
TEST_METHOD(MyTest_ParamA)
{
MyTest("A");
}
TEST_METHOD(MyTest_ParamB)
{
MyTest("B");
}
答案 1 :(得分: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));
}
};
您需要从build中排除“unittest.cpp”。
答案 2 :(得分:0)
快速简单的解决方案:
在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);
}
}
};
}