CppUnit Tests über Interface-Klassen



  • Hallo zusammen,

    ich möchte meine Schreibarbeit beim Erstellen von UnitTests gerne reduzieren und doppelten Code vermeiden. Deshalb war meine Idee nicht mit jeder neuen Klasse einen eigenen Uni-Test zu schreiben, sondern stattdessen (wo möglich) nur einen einzigen Test basierend auf der geerbten Interface-Klasse. Instanzen der konkreten Implementationen würde ich dann über Factorys in den setUp() und tearDown() Methoden der TestFixtures erzeugen. Soweit so gut.

    Mein Problem ist nun, ich würde gerne alle konkreten Implementationen in einem einzigen Testlauf prüfen lassen. Hab aber keine Ahnung, wie ich das elegant anstellen könnte. Zur Zeit müsste ich immer die entsprechende Factory einsetzen.

    Zur Veranschaulichung villeicht noch ein knappes Beispiel (unwesentliche Details, wie Destruktoren usw mal dreist weggelassen)

    class IVehicle{
    	virtual bool wrumwrum() = 0;
    }
    
    class Car : public Vehicle
    class Truck : public Vehicle
    
    class VehicleTest : public CPPUNIT_NS::TestFixture
    {
    	CPPUNIT_TEST(someTest);
    private:
    	IVehicle *pVehicle;
    
    public:
    	void setUp()
    	{
    		pVehicle = CarFactory.create();
    //		pVehicle = TruckFactory.create();
    	}
    	void tearDOwn()
    	{
    		delete pVehicle;
    	}
    protected:
    	void someTest()
    	{
    		pVehicle->wrumwrum();
    	}
    }
    


  • Ein Templateparameter der den konkreten Typ oder die jeweilige Fabrik angibt?



  • brotbernd schrieb:

    Ein Templateparameter der den konkreten Typ oder die jeweilige Fabrik angibt?

    Das funktioniert tatsächlich und zwar folgendermaßen (man beachte die letzten zwei Zeilen).

    #include <cppunit/config/SourcePrefix.h>
    #include <cppunit/extensions/HelperMacros.h>
    
    #include <ivehicle.h>
    #include <car.h>
    #include <truck.h>
    
    template <class T>
    class IVehicleTest : public CPPUNIT_NS::TestFixture
    {
    	CPPUNIT_TEST_SUITE(IVehicleTest<T>);
    	CPPUNIT_TEST(someTest);
    	CPPUNIT_TEST_SUITE_END();
    private:
    	IVehicle *pVehicle;
    public:
    	void setUp()
    	{
    		pVehicle = new T();
    	}
    	void tearDown()
    	{
    		delete pVehicle;
    	}
    protected:
    	void someTest()
    	{
    		CPPUNIT_ASSERT( pVehicle->wrumwrum() );
    	}
    };
    
    CPPUNIT_TEST_SUITE_REGISTRATION(IVehicleTest<Car>);
    CPPUNIT_TEST_SUITE_REGISTRATION(IVehicleTest<Truck>);
    

    Ob das aber so schön ist weiß nicht. Von den CppUnit Entwicklern war das jedenfalls nicht so geplant, denn die Ausgabe des Testlaufs kriegt es nicht hin die spitzen Klammern der Template-Klasse und den Scope-Operator richtig darzustellen 😃


Anmelden zum Antworten