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).
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.
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.
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.
> 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.
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.