4

Я занимаюсь разработкой на основе C++ тестов. У меня есть набор классов, которые делают то же самое, например.Тестирование на модуле C++ с использованием тестового класса шаблонов

тот же ввод дает тот же результат (или должен, вот что я пытаюсь проверить). Я использую Visual Studio 2012's

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?

Есть ли еще один модуль тестирования модулей, который позволил бы мне это сделать?

ответ

2

Я не знаю, если есть способ сделать это с 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

Приветствия за ответ. Для тех, кто смотрит на этот googletest, это немного боль, чтобы идти. Я использовал их в руководствах http://blog.knatten.org/2012/09/26/installing-and-using-googletest-with-visual-studio/ и http://stackoverflow.com/questions/531941/как в установке, Google-с-тестирование-каркасного GTEST-на-визуальному-студия-2005. Он не компилируется в Visual Studio 2012, если вы не зададите компилятору версию 2010 в свойствах проекта. –

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)); 
    } 
}; 

Вам нужно будет исключить «unittest.cpp» из сборки.