Neben roundup und shunit2 meine Übersicht über auch Test-Tools Shell-Einheit enthalten assert.sh und shelltestrunner.
Ich stimme größtenteils mit der Kritik des Verfassers von shunit2 (einige davon subjektiv) überein, so dass ich shunit2 ausschloss, nachdem ich die Dokumentation und die Beispiele angeschaut hatte. Obwohl es vertraut war, einige Erfahrungen mit jUnit gemacht zu haben.
Meiner Meinung nach ist Shellstrunner das originellste der Tools, die ich untersucht habe, da es eine einfache deklarative Syntax für die Testfalldefinition verwendet. Wie üblich bietet jede Ebene der Abstraktion eine gewisse Bequemlichkeit auf Kosten einer gewissen Flexibilität. Obwohl die Einfachheit attraktiv ist, fand ich das Tool zu einschränkend für den Fall, den ich hatte, 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 erlaubt, entweder Ausgang oder Ausgang Status geltend zu machen, während ich beide brauchte. Lange genug, um ein paar Testfälle mit Roundup zu schreiben. Aber ich fand bald den set -e
Modus des Ansatzes unbequem, da in einigen Fällen ein Nicht-Null-Exit-Status als Mittel zum Kommunizieren des Ergebnisses zusätzlich zu stdout erwartet wird, was den Testfall in diesem Modus versagt. One of the samples zeigt die Lösung:
status=$(set +e ; rup roundup-5 >/dev/null ; echo $?)
Aber was, wenn ich sowohl den Nicht-Null-Exit-Status und die Ausgabe benötigen? Ich könnte natürlich set +e
vor dem Aufruf und set -e
nach oder set +e
für den gesamten Testfall. Aber das ist gegen das Prinzip der Zusammenfassung "Everything is an Assertion". Es fühlte sich an, als würde ich gegen das Werkzeug arbeiten.
Bis dahin habe ich den „Nachteil“ des assert.sh realisiert zu erlauben, nur entweder behauptet Exit-Status oder Ausgang ist eigentlich kein Thema, da ich gerade in test
mit einer Verbindung Ausdruck wie diese
output=$($tested_script_with_args)
status=$?
expected_output="the expectation"
assert_raises "test \"$output\" = \"$expected_output\" -a $status -eq 2"
passieren kann
Da meine Bedürfnisse wirklich grundlegend waren (eine Reihe von Tests ausführen, anzeigen, dass alles gut gelaufen ist oder was fehlgeschlagen ist), mochte ich die Einfachheit von assert.sh, also habe ich das ausgewählt.
Sie können auch bashtest util überprüfen: https: // GitHub.com/pahaz/bashtest (es ist eine einfache Möglichkeit, bash-Tests zu schreiben) – pahaz
Roundup formalisiert einige Aufgaben/Tags für Sie. Sobald Sie über den Lernhöcker kommen, ist es sehr nützlich. Persönlich mag ich die Vorgehensweise von haridsv besser, da ich nicht ein anderes Paket installieren muss. Ich habe diesen Ansatz auf Shell-Skript und Python-Tests angewendet. – todo
Checkout diese Übersicht über fast jedes mögliche Werkzeug: https://medium.com/wemake-services/testing-bash-applications-85512e7fe2de – sobolevn