Модульное тестирование 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 в качестве источника здесь.

Идиома, которую вы захотите:

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" из сборки.

Другие вопросы по тегам