Boost Test: Abhängigkeiten zwischen Tests?



  • Moin Leute,

    Ich wollte mit Boost Tests ein Paar Unittests schreiben. Nun habe ich das Problem, dass mehrere Tests aufeinander aufbauen. Es geht darum, das sich eine svd berechne. In Test1 wird getestet ob die SVD erfolgreich war (also ob die Ausgaben stimmen), in Test 2 muss das Ergebnis dann sortiert werden, was geprüft wird und in Test3 wird basierend auf der sortierten Menge eine weitere Funktion aufgerufen.

    Ich habe das jetzt so gelöst:

    //sets up svd for all testcases, so that we can use the result in all tests
    struct SVDTestFixture
    {
    	//stored svd for every testcase
    	Array< double > A;// input matrix
    	Array< double > U;// the two orthogonal
    	Array< double > V;// matrices
    	Array< double > w;
    
    	SVDTestFixture()
        {
            //calculating SVD
            //...
        }
    };
    
    BOOST_FIXTURE_TEST_SUITE(SVDResults, SVDTestFixture);
    
    BOOST_AUTO_TEST_CASE( LinAlg_svd )
    {
        //testing correctness of svd
    }
    BOOST_AUTO_TEST_CASE( LinAlg_svdsort )
    {
        // Sorting singular values by descending order(in place):
        svdsort(U, V, w);
        //...
    }
    BOOST_AUTO_TEST_CASE( LinAlg_svdrank )
    {
        // Determining rank of matrix A:
        unsigned r = svdrank(A, U, V, w);
    }
    BOOST_AUTO_TEST_SUITE_END();
    

    Ich habe das also so gelöst,d as sich in einer Fixture zuerst die SVD berechne, diese in Test1 checke dann die Werte der Fixture in Test2 sortiere (und teste) und dann mit der sortierten fixture in test3 den Rang berechne.

    Bei mir funktioniert das jetzt so. Aber ist diese Reihenfolge nun gewährleistet oder können da komische Dinge passieren? Wenn ja, wie könnte man das verbessern? Was sit der kanonische Weg um sowas zu machen?



  • Ich weiß zwar nicht ob das auch ein Prinzip der Boost-Test-Suite ist, aber die Universitätslehrmeinung in diesem Punkt lautet "Unit-Tests bauen nicht aufeinander auf".

    Du solltest einem weiteren Test, welcher Ergebnisse aus dem Vortest benötigt ein korrektes Ergebnis via Mocking liefern. Dabei kannst du verschiedenste Werte testen, allerdings jeweils nur einen pro Test (Unit-Tests sollen deterministisch sein und dementsprechend keine Random-Werte als Input erhalten).

    MfG SideWinder



  • SideWinder schrieb:

    Ich weiß zwar nicht ob das auch ein Prinzip der Boost-Test-Suite ist, aber die Universitätslehrmeinung in diesem Punkt lautet "Unit-Tests bauen nicht aufeinander auf".

    Wenn ich das richtig verstehe, sollte ich also statt die berechneten Ergebnisse durch die tests zu schicken eher in Test1 mit den Zielwerten vergleichen, dann in Test2 nur die Zielwerte von Test1 als Eingabe nehmen, usw?

    Klingt irgendwie logisch...führt leider dazu, dass ich doch ordentlich code-Wiederholungen habe 😞



  • otze schrieb:

    führt leider dazu, dass ich doch ordentlich code-Wiederholungen habe 😞

    Wo hast du Code-Wiederholungen die du nicht in eigene Funktionen auslagern kannst?



  • pumuckl schrieb:

    otze schrieb:

    führt leider dazu, dass ich doch ordentlich code-Wiederholungen habe 😞

    Wo hast du Code-Wiederholungen die du nicht in eigene Funktionen auslagern kannst?

    Ne Menge Deklarationen und Initialisierungen. Die wollte ich mir eigentlich sparen. Naja, ich habe das jetzt so gelöst, dass ich einfach separate Tests schreibe. Ist besser so.

    Aber Danke euch 🙂



  • otze schrieb:

    pumuckl schrieb:

    otze schrieb:

    führt leider dazu, dass ich doch ordentlich code-Wiederholungen habe 😞

    Wo hast du Code-Wiederholungen die du nicht in eigene Funktionen auslagern kannst?

    Ne Menge Deklarationen und Initialisierungen. Die wollte ich mir eigentlich sparen.

    Und die können nicht in ein Fixture eingebaut werden, in dem sie initialisiert werden? IIRC können Fixtures voneinander erben...


Log in to reply