Hauptmenü

Unit Test?

Begonnen von herrmannj, 10 Mai 2020, 12:54:23

Vorheriges Thema - Nächstes Thema

Sidey

Zitat von: RichardCZ am 05 Juni 2020, 08:42:52
Wenn Du mir einen Link auf Deinen automatisierten Testprozess schicken könntest, kann ich ja schauen ob/wie ich den integrieren kann.


Ich hatte gedacht, dass ich vielleicht etwas allgemeingültiges integrieren könnte. Daher auch die Frage, ob die Tests schon in FHEM integriert sind.

Ich deploye nichts, daher auch keine pipeline. Wäre aber mal eine Idee, ob ich nicht ins SVN deployen könnte. hmmmmm  8)
https://github.com/RFD-FHEM/RFFHEM/actions/runs/125311624
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

StefanStrobel

Hallo Rudi,

könntest Du die FhemTestUtils um eine Funktion erweitern, die die Zeit einer im Log gefundenen Zeile liefert?
z.B.:

sub FhemTestUtils_getLogTime {
    my $arg = shift;
    foreach my $line (@logs) {
        if ($line =~ m{ \A ([0-9\.]+ \s [0-9\:\.]+) \s .* $arg .* }xms) {
            my @a = split("[T: -\.]", $1);
            return mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1) + $a[6]/1000;
        }
    }
    return;
}


Ich habe so für Modbus die Möglichkeit die Timing-Parameter zu testen.

Gruss / Thanx
    Stefan

rudolfkoenig

Danke fuer den Patch, habs hinzugefuegt und dokumentiert.
Ich musste es etwas anpassen, u.a. weil mseclog nicht immer aktiviert ist: kannst Du es bitte testen.

Apropos Unit-Test:
- die HTTPMOD Tests benoetigen die JSON und Test::V0 perl Module.  Ich wuensche mir, dass das Fehlen von optionalen perl Modulen kein Fehler, sondern eine Bemerkung beim Test produziert, so wie bei etlichen Perl-Modulen.
- selbst nach Installieren des JSON Moduls bleiben 3 HTTPMOD Fehler uebrig.

StefanStrobel

Zitat von: rudolfkoenig am 24 August 2020, 12:24:46
Danke fuer den Patch, habs hinzugefuegt und dokumentiert.
Ich musste es etwas anpassen, u.a. weil mseclog nicht immer aktiviert ist: kannst Du es bitte testen.
funktioniert. Vielen Dank!

Zitat
Apropos Unit-Test:
- die HTTPMOD Tests benoetigen die JSON und Test::V0 perl Module.  Ich wuensche mir, dass das Fehlen von optionalen perl Modulen kein Fehler, sondern eine Bemerkung beim Test produziert, so wie bei etlichen Perl-Modulen.
- selbst nach Installieren des JSON Moduls bleiben 3 HTTPMOD Fehler uebrig.

Das ist ein guter Punkt. Wenn ein Test JSON-Features von HTTPMOD testet, dann schlagen die natürlich fehl, wenn die dafür nötigen Libs nicht vorhanden sind.
Ich würde das so umbauen, dass diese Tests nur noch ausgeführt werden wenn die Libs auch da sind und andernfalls eine Meldung erzeugen.

Was wäre denn der bevorzugte Melde-Weg? Log3 oder gibt es da etwas Test-spezifisches?

Die offenen Fehler sind übrigens echte Bugs, die in der nächsten HTTPMOD-Version behoben sind (gerade im Forum mit der Bitte um Tests von Anwendern)

Gruß
    Stefan

rudolfkoenig

ZitatWas wäre denn der bevorzugte Melde-Weg? Log3 oder gibt es da etwas Test-spezifisches?
Was Test-spezifisches, was man beim ausfuehren von prove sieht.
Wie das geht, muesste ich auch erforschen.

Sidey

Da gibt es was von der Stange um auf Packages zu prüfen:

https://metacpan.org/pod/Test2::Require::Module

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

StefanStrobel

Hallo,

ich habs jetzt so gelöst:

##############################################
# test extractAllReadings
##############################################
use strict;
use warnings;
use Test::More;

eval "use JSON";
if ($@) {
    plan skip_all => "This test checks an optional JSON-Feature of HTTPMOD and can only be run with the JSON library installed. Please install JSON Library (apt-get install libjson-perl)";
} else {
    plan tests => 3;
}
...


benötigt kein Test2 und zeigt bei prove eine nette Meldung an:

pi@PI-Fhem:/opt/fhem $ prove `find t/FHEM/98_HTTPMOD -name \*.t`
t/FHEM/98_HTTPMOD/40_maxAge.t .......... ok
t/FHEM/98_HTTPMOD/99_evalExpr.t ........ ok
t/FHEM/98_HTTPMOD/50_Replacements.t .... ok
t/FHEM/98_HTTPMOD/20_extractAllJSON.t .. skipped: This test checks an optional JSON-Feature of HTTPMOD and can only be run with the JSON library installed. Please install JSON Library (apt-get install libjson-perl)
t/FHEM/98_HTTPMOD/90_SmallFeatures.t ... ok
t/FHEM/98_HTTPMOD/30_requestExpr.t ..... ok
t/FHEM/98_HTTPMOD/31_Regexes.t ......... ok
t/FHEM/98_HTTPMOD/10_Redirects.t ....... ok
t/FHEM/98_HTTPMOD/36_JSONExpr.t ........ skipped: This test checks an optional JSON-Feature of HTTPMOD and can only be run with the JSON library installed. Please install JSON Library (apt-get install libjson-perl)
All tests successful.
Files=9, Tests=39,  9 wallclock secs ( 0.28 usr  0.00 sys +  7.25 cusr  0.34 csys =  7.87 CPU)
Result: PASS


Um in einem Test erst mal zu prüfen, ob ein Modul da ist mache ich das mit:

use_ok ('FHEM::HTTPMOD::Utils', qw(:all));


auch das geht mit Test::More. Test2 habe ich gar nicht verwendet, da das ja auch wieder fehlen könnte.

Gruss
   Stefan

Sidey

Geht natürlich auch so mit eval, meine 5ct:
Verwende gleich Test2 wenn Du noch am Anfang stehst, das bringt viele Vereinfachungen mit und wird weiter entwickelt.

Gruß Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

rudolfkoenig


StefanStrobel

Hallo Rudi,

würde etwas dagegen sprechen in DevIo die Zeile

use Time::HiRes     qw(time);

oben einzufügen?
Dann könnte man auch Bruchteile von Sekunden für nextOpenDelay verwenden.

Ich versuche gerade weitere Tests für das Modbus-Modul zu schreiben, unter anderem für das Timing. Da wäre es hilfreich, wenn man auch kurze Delays setzen könnte, die dann auch exakt umgesetzt werden. Bei der aktuellen Auflösung auf die jeweils nächste volle Sekunde, müssten die Tests jeweils mehrere Sekunden laufen.
Außer der obigen Zeile wären keine weiteren Änderungen nötig.

Gruss
   Stefan

rudolfkoenig

Ich habe lieber time() durch gettimeofday() ersetzt.
Sie wird bereits in fhem.pl reingeholt, ich verwende sie eher, und weiss deswegen sofort, dass hier irgendwas mit Nachkommastellen gemacht wird.

StefanStrobel

Vielen Dank!

Gruss
   Stefan