Unittests bei Modulen mit Zeitabhängigkeit



  • Hi zusammen

    ich habe ein Modul, dessen Verhalten abhängig von der Systemzeit ist, weil es mit Verzögerungen / Wartezeiten arbeitet. Teilweise auch im Minutenbereich.
    Für dieses Modul baue ich Unittests, mit denen ich das Verhalten abtesten will.

    Nun fallen wir nur zwei Möglichkeiten ein, wie ich das machen kann:

    1. ich baue Sleeps in die Unittests ein ( mehrere Sekunden ) ? Nervt bei vielen Tests.
    2. Ich baue die Zeitabhängikeit in eine kleine Wrapper-Klasse, so dass im Falle eines Unittests die aktuelle Zeit nicht von der Systemzeit kommt sondern von einem Sekundencounter den ich selbst beeinflussen kann.

    PseudoCode:

    class SystemTime
    {
    public:
        inline Time getActTime()  const
        {
            #ifdef _TEST_
                 return systemTime(); // Hier beliebige Systemfunktion einsetzen
           #else
                return FakeTime;
           #endif
        }
        
    
       inline void setTime( Time time_ ) { FakeTime = time_; }
       inline void addSeconds( uint32_t seconds ) { FakeTime += seconds; }
    
    private:
         Time FakeTime;
    };
    
    

    Eine Instanz dieser Klasse würde ich dann quasi an das Modul als const-Referenz übergeben.

    Könnte man das so machen, oder ist das eher nicht so ne gute Idee?



  • Mit Dingen wie #ifdef _TEST_ sollte man vorsichtig sein.

    Ich würde da eher eine rein abstrakte Interface-Klasse verwenden:

    class SystemClock {
    public:
        virtual SystemTime now() const = 0;
    };
    

    Und dann machst du zwei Klassen die SystemClock implementieren, eine für den Normalbetrieb und eine für die Tests.

    ps:

    getActTime

    Ich nehme an "act" steht hier für "actual". Das englische "actual" und das deutsche "aktuell" werden aber sehr unterschiedlich verwendet. "actual" bedeutet "eigentlich", "tatsächlich". Das Wort das du suchst ist "current".



  • Danke dir 🙂 So mach ichs. Das mit "act" = "aktuell" hat sich leider hier im Team so eingepraegt ueber die Jahre... 😃


Log in to reply