Unit-Test Google - Zeit



  • Hallo

    Ich habe die letzten Wochen in meinem Buch über C++ Grundlagen gelesen und möchte nun unter anderem dazu übergehen zu jeder Funktion die ich code Unit-Tests zu erstellen und zwar für typische Funktionseingaben und für Spezialfälle, welche die Funktionen einnehmen können. Ich glaube dieses Vorgehen kann das Debuggen sehr erleichtern. Dazu verwende ich das Google Test Framework gtest.

    https://github.com/google/googletest

    Nun habe ich folgendes kleine Programm RoutineTest geschrieben:

    #include <gtest/gtest.h>
    #include "../Routine.cpp"
    
    // _____________________________________________________________________
    // Unit-Test of the Hamming-Distance Function
    std::vector<int> a = {1,0,1,0}; std::vector<int> b = {1,0,1,0};
    std::vector<int> c = {1,1,1,0}; std::vector<int> d = {0,0,0,1};
    
    TEST(Routine, HammingDistance) {
      ASSERT_EQ(0, Routine::HammingDistance(a,b));
      ASSERT_EQ(4, Routine::HammingDistance(c,d));
    }
    
    // _____________________________________________________________________
    int main(int argc, char** argv) {
     ::testing::InitGoogleTest(&argc, argv);
     return RUN_ALL_TESTS();
    }
    

    Und meine Datei Routine.cpp, welche die Funktion enthält sieht wie folgt aus (Darin stehen noch weitere Funktionen):

    #include <vector>
    #include <cstdlib>
    #include <algorithm>
    #include <iostream>
    #include "./Routine.h"
    
    // _____________________________________________________________________
    // Hamming distance of two vectors
    int Routine::HammingDistance(std::vector<int> &vecA, std::vector<int> &vecB) {
    int hm_distance; hm_distance=0;
    
    for(size_t i=0; i<vecA.size(); i++){
    if(!(vecA[i]==vecB[i])){hm_distance++;} else{hm_distance=hm_distance+0;}
    }
    
    return hm_distance;
    }
    

    Die zugehörige Header Datei Routine.h sei

    #include <vector>
    
    // A namespace for routines and algorithms
    namespace Routine {
    
      // Hamming distance (bitwise)
      int HammingDistance(std::vector<int> &vecA, std::vector<int> &vecB);
    }
    

    Mein Testprogramm kompiliert ohne Warnungen und wird ausgeführt. Die Ausgabe ist aber:

    [==========] Running 1 test from 1 test case.
    [----------] Global test environment set-up.
    [----------] 1 test from Routine
    [ RUN      ] Routine.HammingDistance
    [       OK ] Routine.HammingDistance (0 ms)
    [----------] 1 test from Routine (0 ms total)
    
    [----------] Global test environment tear-down
    [==========] 1 test from 1 test case ran. (0 ms total)
    [  PASSED  ] 1 test.
    

    Mein erster Unit Test und erst dachte ich "sehr fein", doch dann wurde ich direkt bei der Zeit stutzig. "0 ms total" Daraus resultieren zwei Möglichkeiten für mich:

    1.) Rundungsfehler: Das Programm wird, weil es so wenig Code ist und klein, so schnell ausgeführt, dass diese Anzeige gerundet ist.

    2.) Ich habe Mist programmiert und nicht den Hauch einer Idee was falsch ist 😞

    Weiss jemand welche der Optionen es ist oder hat einen Tipp dazu für mich?

    Danke und Grüße



  • Ja, das ist wohl so schnell, daß das als 0ms ausgewertet wird.
    Probiere einfach mal einen größeren vector, z.B. mit 1-100 Mio Einträgen (und selbst das sollte nur einige ms dauern).
    Wenn du dir nicht sicher bist, kannst du bei Unit-Tests ja auch einfach mal einen falschen Wert als ASSERT angeben, und dann testen, ob wirklich der Test 'failed'.


Log in to reply