Forum: PC-Programmierung Tests in Makefile - Wie Zusammenfassung statt Abbruch beim ersten fehlgeschlagenen Test??


von DPA (Gast)


Lesenswert?

Ich habe ein Programm, bei dem ich diverse white box & integration tests 
erstellen muss, um Regressionen bei den nächsten paar gröberen 
Änderungen zu vermeiden. Im Grunde habe ich eine statische Library mit 
allen Progrmmdateien, und die linke ich dann zu den Programmen, die 
bestimmte Sachen testen können. Im Makefile habe ich zu diesen dann 
jeweils eine Liste mit testcases, das Makefile weiss dann, wie der Test 
ausgeführt wird, und ruft das Testprogramm entsprechend auf.

Also quasi so: (stark vereinfacht)
1
TESTS=a b c d
2
3
test: $(addprefix test-,$(TESTS))
4
5
test-%: testprogramm
6
  testprogram $@

Nun bricht das natürlich gleich beim ersten fehlgeschlagenen Test ab. 
Eigentlich würde ich aber gerne noch sehen, wie Schlimm die Situation 
gerade ist, also alle Tests Ausführen, Zusammenfassung ausgeben, und 
dann abbrechen falls einer fehlschlug.

Ich suche keine c testing suite oder sowas, sondern eher was wo ich 
angeben kann "führe "make test-$1" aus für a b c d und gib mir die 
Zusammenfassung", es soll aber auch gehen, wenn ein Test mehrere 
Untertests hat. Am besten wäre vermutlich irgendein simples Script oder 
so. Falls ein externes Programm in frage kommt, darf es nichts 
exotisches sein, es muss schon in Debian sein. Wenn es da irgendeine 
Standardlösung gäbe, die in solchen Situationen häufig verwendet wird, 
wäre das natürlich ideal.

Ich erwarte auch keine fertige Lösung oder Code, sondern lediglich Ideen 
und Beispiele, wie ihr da vorgehen würdet. (Sonnst müsste ich aus 
Lizenztechnischen gründen Erlaubnis einholen, das in Projekt X mit 
Lizenz Y verwenden zu dürfen, und das würde dann auch wieder unnötig 
aufwendig werden).

von Walter T. (nicolas)


Lesenswert?

DPA schrieb:
> Nun bricht das natürlich gleich beim ersten fehlgeschlagenen Test ab.

Eigentlich nicht. Eigentlich wird nur der einzelne Test ab der ersten 
fehlgeschlagenen Assertion abgebrochen. Alle anderen Test - auch 
innerhalb der Gruppe - werden trotzdem durchgeführt.

Üblicherweise sieht doch die Abschlußmeldung immer aus in der Form
x Tests, y Failures, z Ignored und dann noch ein paar Details zu den 
Failures und Ignores.

So ist es zumindest in allen mir bekannten Frameworks. Wenn es bei Dir 
nicht so ist: Schreib etwas mehr über Dein Framework.

: Bearbeitet durch User
von schotter (Gast)


Lesenswert?


von DPA (Gast)


Lesenswert?

Walter T. schrieb:
> So ist es zumindest in allen mir bekannten Frameworks. Wenn es bei Dir
> nicht so ist: Schreib etwas mehr über Dein Framework.

Ich schreibe ja oben, wie ich das mache. Ich habe nicht ein einziges 
Programm mit dazugeklinktem Testingframework, ich habe mehrere 
Programme, die können einen Check anhand einer Eingabe durchführen. 
Normalerweise wird dort für jeden Testcase ein Programm einmal 
aufgerufen, mit Testcase spezifischen Parametern, und dass beendet sich 
dann entweder erfolgreich (rc=0), oder auch nicht (rc!=0). Jeder Test 
hat ein makefile target, und dann ist im Makefile ein Target, das alle 
Test targets aufruft. Ungefähr so, wie in dem Beispiel oben. Ich habe 
also noch kein Testingframework in dem sinne. Für spezifische Sprachen 
kenne ich welche, aber für die Situation hier nicht.

schotter schrieb:
> 
https://stackoverflow.com/questions/2670130/make-how-to-continue-after-a-command-fails

Das hilft mir leider auch nicht weiter. Ich will ja, das make am Schluss 
einen Fehler ausgibt, wenn einer fehlschlägt. Auch das ist aber nicht 
allzu schwer, das Hauptproblem ist, am ende eine schöne Statistik zu 
bekommen.

von Walter T. (nicolas)


Lesenswert?

DPA schrieb:
> Für spezifische Sprachen
> kenne ich welche, aber für die Situation hier nicht.

Das heißt Deine Binaries werden aus verschiedenen Sprachen 
zusammengelinkt? Oder es gibt keins in Deiner Sprache? Üblicherweise 
tests man ja nur in einer Sprache, und die Elemente aus anderen Sprachen 
werden als Stubs/Fixtures ergänzt.

von schotter (Gast)


Lesenswert?

> schotter schrieb:
>>
> 
https://stackoverflow.com/questions/2670130/make-how-to-continue-after-a-command-fails
>
> Das hilft mir leider auch nicht weiter. Ich will ja, das make am Schluss
> einen Fehler ausgibt, wenn einer fehlschlägt. Auch das ist aber nicht
> allzu schwer, das Hauptproblem ist, am ende eine schöne Statistik zu
> bekommen.

Da fällt mir nur noch "händisches" Auswerten der Rückgabewerte ein. Mit 
entsprechender Gewichtung lässt sich das bestimmt noch in eine Schleife 
packen, damit am Ende die Auswertung wiederum sagen kann, welcher Test 
genau nicht bestanden wurde.

von DPA (Gast)


Lesenswert?

Walter T. schrieb:
> DPA schrieb:
>> Für spezifische Sprachen
>> kenne ich welche, aber für die Situation hier nicht.
>
> Das heißt Deine Binaries werden aus verschiedenen Sprachen
> zusammengelinkt? Oder es gibt keins in Deiner Sprache? Üblicherweise
> tests man ja nur in einer Sprache, und die Elemente aus anderen Sprachen
> werden als Stubs/Fixtures ergänzt.

Die Programme selbst sind alle in C, das spielt im Grunde aber keine 
Rolle, wenn ich da ein Testframework für C dazulinken würde, hätte ich 
halt n Statistiken zu je einem Test, statt eine Statistiken für alle n 
tests, was ziemlich sinnlos wäre.

Zum besseren Verständnis, hier mal das Projekt, das ich Testen will (ist 
aber noch unfertig sind erst ein zwei Tests dort):
https://github.com/Daniel-Abrecht/libttymultiplex/

Die Tests sind im "test" Unterverzeichnis.

Das Programm ist ein terminal multiplexer, und damit auch ein terminal 
Emulator. Für Testzwecke gibt es deshalb momentan 2 Testprogramme:
  1) Das "partest" Testprogrämmchen nimmt eine Eingabe von Standardinput 
an, und schreibt in ein paar Dateien, wie das simulierte Terminal danach 
aussehen würde (welches Zeichen steht wo, wie formatiert, etc.). Die 
Testcases für das Programm sind im "partest/check" Unterordner, das 
Shellscript dort generiert die Eingabe für das partest Program, und die 
dazugehörenden Dateien im "testcasename.expected" Ordner die erwartete 
Ausgabe. Das makefile im "partest" hat ein Target "test-%" für das 
durchführen eines beliebigen Tests, welcher das Script und Testprogramm 
aufruft, und dann das Resultat checkt. Zudem hat es ein "test" target, 
das damit alle Testcases durchführt. (Im moment ist aber erst ein 
testcase dort.

  2) Das "seqtest" Testprogrämmchen wird mit einer Escapesequenz als 
Parameter aufgerufen. Es hat ein Callback im Parser, womit es checkt, ob 
gerade eine Escapesequenz, ein normales Zeichen, oder ein 
Kontrollzeichen erkannt wurde. Es wird immer mit einer Escapesequenz 
oder einem Kontrollzeichen aufgerufen, und sollte deshalb nie ein 
normales Zeichen erkennen. Tut es das trotzdem, beendet es sich mit 
Fehlercode, und der Test schlägt fehl. Die Escapesequenzen die gecheckt 
werden werden mit terminfo von der mit $TERM selektierten terminal 
Datenbank abgefragt. (Im Moment verwende ich TERM=xterm, aber eine 
spezifisch für dieses Projekt muss ich noch machen, was einer der Gründe 
für das Testprogrämmchen ist.) Und der Test ist momentan noch unter dem 
"check-sequence" target statt dem "test" target, weil noch nicht alle 
xterm Escapesequenzen implementiert sind, und der Test damit sonst immer 
Fehlschlagen würde, was meinem CI nicht gefallen würde.

Später kommen eventuell noch mehr Tests und Testprogramme dazu. Ich will 
einfach jeweils eine Zusammenfassung all der Tests, "partest" x/n, 
"seqtest" y/m, gesammt  "k/o".


schotter schrieb:
> Da fällt mir nur noch "händisches" Auswerten der Rückgabewerte ein. Mit
> entsprechender Gewichtung lässt sich das bestimmt noch in eine Schleife
> packen

Ja, darauf wird es wohl hinauslaufen... Ich hatte gehofft, es gäbe dafür 
eventuell schon irgend eine Kommando/Programm oder so, um sowas zu 
machen.

von Marten Morten (Gast)


Lesenswert?

Bei GNU make die -k Kommandozeilen-Option verwenden.
https://www.gnu.org/software/make/manual/html_node/Errors.html#Errors 
Die letzten drei Paragraphen.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hast Du schon mal überlegt, ein Test-Framework, wie catch2 oder 
Boost.Test zu verwenden? Die können das alles, was Du haben möchtest.

von Daniel A. (daniel-a)


Lesenswert?

Ich hab mir jetzt einfach selbst was gebastelt:
https://github.com/Daniel-Abrecht/libttymultiplex/tree/master/test/test-summary
https://github.com/Daniel-Abrecht/libttymultiplex/tree/master/test/script

Verwendungsbeispiel:
1
$ test-summary all bash
2
$ test-summary suite-1 bash
3
$ test-exec test-1 false
4
$ test-exec test-2 true
5
$ exit
6
7
Summary:   1 Successful   1 Failed   2 Total
8
9
$ test-summary suite-2 bash
10
$ test-result 5 3 bla-test-results
11
$ exit
12
13
Summary:   3 Successful   2 Failed   5 Total
14
15
$ test-result 1 1 test-3
16
$ exit
17
18
Result for suite-1:   1 Successful   1 Failed   2 Total
19
Result for suite-2:   3 Successful   2 Failed   5 Total
20
Summary:   5 Successful   3 Failed   8 Total

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.