我正在做一些C ++测试驱动的开发。我有一组类做同样的事情,例如
相同的输入给出相同的输出(或应该,这是我试图测试的)。我正在使用Visual Studio 2012的
CppUnitTestFramework。我想创建一个模板化的测试类,所以我编写了一次测试,并且可以根据需要在类中进行模板,但是我找不到这样做的方法。我的目标:
/* two classes that do the same thing */
class Class1
{
int method()
{
return 1;
}
};
class Class2
{
int method()
{
return 1;
}
};
/* one set of tests for all classes */
template< class T>
TEST_CLASS(BaseTestClass)
{
TEST_METHOD(testMethod)
{
T obj;
Assert::AreEqual( 1, obj.method());
}
};
/* only have to write small amout to test new class */
class TestClass1 : BaseTestClass<Class1>
{
};
class TestClass2 : BaseTestClass<Class1>
{
};
有没有办法可以使用CppUnitTestFramework做到这一点?
是否有其他单元测试框架可以让我这样做?
答案 0 :(得分:1)
我不知道是否有办法用CppUnitTestFramework做到这一点, 我不熟悉,但你可以肯定 在googletest做 指定一个任意的类列表并拥有该框架 生成(模板方式)所有这些测试的相同测试。我觉得 适合你的账单。
您可以将googletest下载为源here。
你想要的成语是:
typedef ::testing::Types</* List of types to test */> MyTypes;
...
TYPED_TEST_CASE(FooTest, MyTypes);
...
TYPED_TEST(FooTest, DoesBlah) {
/* Here TypeParam is instantiated for each of the types
in MyTypes. If there are N types you get N tests.
*/
// ...test code
}
TYPED_TEST(FooTest, DoesSomethingElse) {
// ...test code
}
研究primer和 samples。然后去 AdvancedGuide Typed Tests
另请查看More Assertions
答案 1 :(得分:0)
我遇到了类似的问题:我有一个接口和几个实现。当然我只想针对界面编写测试。另外,我不想为每个实现复制我的测试。
嗯,我的解决方案并不是很漂亮,但它很简单,也是我迄今为止唯一提出的解决方案。
您可以对Class1和Class2执行相同操作,然后为每个实现添加更多专用测试。
<强> 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”。