Wir haben ein System, auf dem neben Java-Code einige Bash-Skripte ausgeführt werden. Da wir versuchen, alles zu testen, was möglicherweise kaputt gehen könnte, und diese Bash-Skripte möglicherweise kaputt gehen, möchten wir sie testen.
Das Problem ist, dass es schwierig ist, Bash-Skripte zu testen.
Gibt es eine Möglichkeit oder eine bewährte Methode, um Bash-Skripte zu testen? Oder sollten wir die Verwendung von Bash-Skripten beenden und nach alternativen Lösungen suchen, die testbar sind?
Antworten:
Es gibt tatsächlich ein shunit2 , ein xUnit-basiertes Unit-Test-Framework für Bourne-basierte Shell-Skripte. Ich habe es selbst nicht benutzt, aber es könnte sich lohnen, es auszuprobieren.
Ähnliche Fragen wurden bereits gestellt:
quelle
Ich habe die folgende Antwort von einer Diskussionsgruppe erhalten:
Diese Methode ähnelt der Abhängigkeitsinjektion für Skripte und klingt vernünftig. Das Vermeiden von Bash-Skripten und die Verwendung einer besser testbaren und weniger undurchsichtigen Sprache ist vorzuziehen.
quelle
TAP- konformes Bash-Testen: Bash Automated Testing System
Fledermauskern
quelle
Nikita Sobolev hat einen ausgezeichneten Blog-Beitrag geschrieben, in dem einige verschiedene Bash-Test-Frameworks verglichen wurden: Testen von Bash-Anwendungen
Für die Ungeduldigen: Nikitas Schlussfolgerung war die Verwendung von Fledermäusen, aber es scheint, dass Nikita das Bats-Kernprojekt verpasst hat, das meiner Meinung nach in Zukunft verwendet werden sollte, da das ursprüngliche Bats-Projekt seit 2013 nicht mehr aktiv gepflegt wurde.
quelle
Epoxy ist ein Bash-Test-Framework, das ich hauptsächlich zum Testen anderer Software entwickelt habe, aber ich verwende es auch zum Testen von Bash-Modulen, einschließlich sich selbst und Carton .
Hauptvorteile sind ein relativ geringer Codierungsaufwand, eine unbegrenzte Verschachtelung von Zusicherungen und eine flexible Auswahl der zu überprüfenden Zusicherungen.
Ich habe eine Präsentation gemacht , in der ich sie mit BeakerLib verglichen habe - einem Framework, das von einigen bei Red Hat verwendet wird.
quelle
Warum ist es Ihrer Meinung nach "schwierig", Bash-Skripte zu testen?
Was ist los mit Test-Wrappern wie:
quelle
Ich habe Shellspec erstellt, weil ich ein benutzerfreundliches und nützliches Tool haben wollte.
Es wurde von einem reinen POSIX-Shell-Skript geschrieben. Es hat mit vielen Muscheln mehr als shunit2 getestet. Es hat mächtige Funktionen als Fledermäuse / Fledermaus-Kern.
Zum Beispiel Unterstützung für verschachtelte Blöcke, leicht zu verspotten / zu stubben, leicht zu überspringen / ausstehend, parametrisierte Tests, Assertion-Zeilennummer, Ausführung nach Zeilennummer, parallele Ausführung, zufällige Ausführung, TAP / JUnit-Formatierer, Abdeckung und CI-Integration, Profiler und so weiter .
Siehe die Demo auf der Projektseite.
quelle
Ich mag Shell2junit , ein Dienstprogramm zum Generieren von JUnit-ähnlichen Ausgaben aus Bash-Skripttests. Dies ist nützlich, da der generierte Bericht dann von kontinuierlichen Integrationssystemen wie den JUnit-Plug-Ins für Jenkins und Bamboo gelesen werden kann.
Shell2junit bietet zwar nicht das umfassende Bash-Scripting-Framework wie shunit2 , ermöglicht Ihnen jedoch eine gute Berichterstattung über die Testergebnisse.
quelle
Versuchen Sie es mit einem Test . Es ist eine einfache Möglichkeit, Ihre Skripte zu testen. Zum Beispiel haben Sie
do-some-work.sh
welche Konfigurationsdateien geändert.PASSWORD = 'XXXXX'
Fügen Sie beispielsweise der Konfigurationsdatei eine neue Zeile hinzu/etc/my.cfg
.Sie schreiben zeilenweise Bash-Befehle und überprüfen dann die Ausgabe.
Installieren:
Das Erstellen von Tests ist nur das Schreiben von Bash-Befehlen.
Datei
test-do-some-work.bashtest
:Führen Sie Tests durch:
Hier und hier finden Sie einige Beispiele
quelle
Vielleicht kann dies verwendet oder dazu beigetragen werden
https://thorsteinssonh.github.io/bash_test_tools/
Beabsichtigt, Ergebnisse in das TAP-Protokoll zu schreiben, was meiner Meinung nach gut für CI und gut für diejenigen ist, die Shell-Umgebungen wollen. Ich stelle mir vor, dass einige Dinge in Shell-Umgebungen ausgeführt werden, daher könnten einige argumentieren, dass sie in ihrer Shell-Umgebung getestet werden sollten.
quelle
Versuchen Sie es mit assert.sh
Ich hoffe es hilft!
quelle
Ich kann nicht glauben, dass niemand über OSHT gesprochen hat ! Es ist sowohl mit TAP als auch mit JUnit kompatibel , es ist eine reine Shell (dh keine anderen beteiligten Sprachen), es funktioniert auch eigenständig und es ist einfach und direkt.
Das Testen sieht folgendermaßen aus (Ausschnitte aus der Projektseite):
Ein einfacher Lauf:
Der letzte Test zeigt "nicht in Ordnung", aber der Exit-Code ist 0, weil es ein ist
TODO
. Man kann auch ausführlich setzen:Benennen Sie es um, um eine
.t
Erweiterung zu verwenden, und fügen Sie es in eint
Unterverzeichnis ein. Sie können esprove(1)
(Teil von Perl) verwenden, um es auszuführen:Setzen
OSHT_JUNIT
oder übergeben-j
, um eine JUnit-Ausgabe zu erzeugen. JUnit kann auch mit kombiniert werdenprove(1)
.Ich habe diese Bibliothek sowohl zum Testen von Funktionen verwendet, indem ich ihre Dateien bezogen und dann Zusicherungen mit
IS
/OK
und ihren Negativen ausgeführt habe, als auch zu Skripten, indem ichRUN
/ verwendet habeNRUN
. Für mich bietet dieses Framework den größten Gewinn bei geringstem Overhead.quelle
Ich habe viele der hier vorgestellten Lösungen ausprobiert, fand die meisten jedoch sperrig und schwer zu verwenden. Deshalb habe ich mein eigenes kleines Testframework erstellt: https://github.com/meonlol/t-bash
Es ist nur eine Datei im Repo, die Sie einfach direkt ausführen können, mit einem grundlegenden Satz von JUnit-Stil-Asserts.
Ich habe es professionell in mehreren internen Projekten verwendet und konnte unsere Bash-Skripte super stabil und regressionsresistent machen.
quelle
Vielleicht möchten Sie einen Blick auf bash_unit werfen:
https://github.com/pgrange/bash_unit
quelle
Schauen Sie sich Outthentic an , es ist einfach, erweiterbar durch viele Sprachen (Perl, Python, Ruby, Bash on Choice) und plattformübergreifendes Framework (Linux, Windows), um alle Befehlszeilenanwendungen zu testen.
quelle
Es fällt mir schwer, die Verwendung von Bash für größere Skripte zu rechtfertigen, wenn Python so große Vorteile bietet:
if [ x"$foo" = x"$bar"]; then ...
' verwenden, die fehleranfällig ist.getopt
Moduls (und es gibt ein noch einfacheres Modul zum Parsen von Argumenten, aber der Name entgeht mir).mysql
Befehl in bash einfügen, aber es ist nicht die beste Art, Code zu schreiben).$*
oder"$*"
oder"$@"
oder$1
oder machen"$1"
. Leerzeichen in Dateinamen sind kein Problem usw. usw. usw.Jetzt benutze ich bash nur für die einfachsten Skripte.
quelle
if [[ $foo = $bar ]]; then ...
. Dies ist immer noch nicht besser als das, was Python zu bieten hat, aber es ist besser als das, was Sie präsentiert haben.trap
(im Fehlerfall bereinigen / rückgängig machen) sowie Regex (dh[[ $1 =~ ^[1-3]{3}$ ]]
). Ich bin mir ziemlich sicher, dass die obskure Syntax, die Sie verwendet haben, sich auf alte Implementierungen von beziehttest
, nicht auf Bash. Bash eignet sich hervorragend für die Anbindung an vorhandene Befehlszeilentools ... Häufig ist eine einzelne Pipe zuawk
odergrep
viel einfacher als die Python-Alternative.optparse
oder sein Nachfolgerargparse
. Ich habe noch nie jemanden gesehen, der dasgetopt
Modul verwendet hat, noch habe ich es persönlich verwendet. Dasgetopt
Dienstprogramm ist jedoch großartig. Das Parsen von Argumenten aus der Shell ist überhaupt kein Problem, wenn Sie ein schönes Muster haben. Wenn Sie nicht versuchen, Unterbefehle im Git-Stil oder ähnliches zu implementieren, ist dies kein großes Problem.