Я занимаюсь разработкой на 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?
Есть ли еще одна система модульного тестирования, которая позволила бы мне это сделать?
Я не знаю, есть ли способ сделать это с CppUnitTestFramework,
с которым я незнаком, но кое-что можно конечно
делать в googletest
это указать произвольный список классов и иметь рамки
генерировать (по шаблону) одинаковые тесты для всех них. я думаю что
будет соответствовать вашему счету.
Вы можете скачать Googletest в качестве источника Вот.
Идиома, которую вы захотите:
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
}
Изучите грунтовка а также
образцы. Затем перейдите к
AdvancedGuide
за Типовые тесты
Также проверьте Больше утверждений
У меня была похожая проблема: у меня есть интерфейс и несколько его реализаций. Конечно, я хочу писать тесты только для интерфейса. Кроме того, я не хочу копировать свои тесты для каждой реализации.
Ну, мое решение не очень красивое, но оно простое и единственное, которое я придумал до сих пор.
Вы можете сделать то же самое для 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));
}
};
Вам нужно будет исключить «unittest.cpp» из сборки.