4

Je fais du développement piloté par les tests C++. J'ai un ensemble de classes pour faire la même chose par ex.Test de test unitaire C++, à l'aide de la classe de test de modèle

même entrée donne la même sortie (ou devrait, c'est ce que j'essaie de tester). J'utilise Visual Studio 2012

CppUnitTestFramework. Je voulais créer une classe de test basée sur un modèle, donc j'écris les tests une fois, et je peux modéliser dans les classes comme nécessaire, mais je ne trouve pas de moyen de le faire. Mon but:

/* 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> 
{ 
}; 

Y at-il un moyen que je peux faire cela en utilisant CppUnitTestFramework?

Existe-t-il un autre cadre de test unitaire qui me permettrait de le faire?

Répondre

2

Je ne sais pas s'il y a un moyen de le faire avec CppUnitTestFramework, avec laquelle je ne connais pas, mais quelque chose vous pouvez certainement faire googletest est de spécifier une liste arbitraire de classes et ont le cadre générer (modèle-sage) le même test (s) pour chacun d'eux. Je pense que correspondrait à votre facture.

Vous pouvez télécharger le google à la source here.

L'idiome que vous voulez est:

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 
} 

Étude du primer et le samples. Ensuite, allez à la AdvancedGuide pour Typed Tests

Consultez également More Assertions

+1

Bravo pour la réponse. Pour ceux qui regardent ce googletest est un peu difficile à faire. J'ai utilisé une combinaison de ces guides pour http://blog.knatten.org/2012/09/26/installing-and-using-googletest-with-visual-studio/ et http://stackoverflow.com/questions/531941/comment-configurer-google-c-testing-cadre-gtest-on-visual-studio-2005. Il ne compile pas dans Visual Studio 2012 à moins que vous définissiez le compilateur à version 2010 dans les propriétés du projet. –

0

j'ai eu un problème similaire: j'ai une interface et plusieurs implémentations de celui-ci. Bien sûr, je veux seulement écrire des tests sur l'interface. De plus, je ne veux pas copier mes tests pour chaque implémentation.

Eh bien, ma solution n'est pas très jolie mais c'est simple et la seule que j'ai trouvée jusqu'à maintenant.

Vous pouvez faire la même chose pour Class1 et Class2, puis ajouter des tests plus spécialisés pour chaque implémentation.

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

Vous devrez exclure « unittest.cpp » de construction.