Neben Roundup und shunit2 meine Übersicht über Shell - Einheit Test - Tools ebenfalls enthalten assert.sh und shelltestrunner .
Ich stimme größtenteils der Kritik des Roundup-Autors an shunit2 zu (einige davon subjektiv), daher habe ich shunit2 ausgeschlossen, nachdem ich mir die Dokumentation und Beispiele angesehen habe. Obwohl es mir bekannt vorkam, einige Erfahrungen mit jUnit zu haben.
Meiner Meinung nach ist shelltestrunner das originellste der Tools, die ich mir angesehen habe, da es eine einfache deklarative Syntax für die Definition von Testfällen verwendet. Wie üblich bietet jede Abstraktionsebene eine gewisse Bequemlichkeit auf Kosten einer gewissen Flexibilität. Obwohl die Einfachheit attraktiv ist, fand ich das Tool für den Fall, den ich hatte, zu einschränkend, hauptsächlich weil es keine Möglichkeit gab, Setup- / TearDown-Aktionen zu definieren (z. B. Eingabedateien vor einem Test bearbeiten, Statusdateien nach einem Test entfernen , etc.).
Ich war zunächst ein wenig verwirrt, dass assert.sh nur das Aktivieren des Ausgabe- oder Exit-Status erlaubt, während ich beides brauchte. Lange genug, um ein paar Testfälle mit Roundup zu schreiben. Ich fand den set -e
Modus der Zusammenfassung jedoch bald unpraktisch, da in einigen Fällen ein Exit-Status ungleich Null erwartet wird, um das Ergebnis zusätzlich zu stdout zu kommunizieren, wodurch der Testfall in diesem Modus fehlschlägt. Eine der Proben zeigt die Lösung:
status=$(set +e ; rup roundup-5 >/dev/null ; echo $?)
Aber was ist, wenn ich sowohl den Exit-Status ungleich Null als auch den Ausgang benötige? Ich könnte natürlich set +e
vor dem Aufruf und set -e
nach oder set +e
für den gesamten Testfall. Aber das widerspricht dem Prinzip der Zusammenfassung "Alles ist eine Behauptung" . Es fühlte sich also so an, als würde ich anfangen, gegen das Werkzeug zu arbeiten.
Bis dahin habe ich erkannt, dass der "Nachteil" von assert.sh, nur den Exit-Status oder die Ausgabe zu bestätigen, eigentlich kein Problem ist, da ich nur test
mit einem zusammengesetzten Ausdruck wie diesem übergeben kann
output=$($tested_script_with_args)
status=$?
expected_output="the expectation"
assert_raises "test \"$output\" = \"$expected_output\" -a $status -eq 2"
Da meine Anforderungen wirklich grundlegend waren (eine Reihe von Tests durchführen, anzeigen, dass alles in Ordnung war oder was fehlgeschlagen ist), mochte ich die Einfachheit von assert.sh, also habe ich mich für diese entschieden.