Sie können Bash-Tests im Verzeichnis unitTests erstellen und ändern. Das Make-Target unit-test-shell unterstützt Sie mit einer verallgemeinerten Bash-Testumgebung.
make unit-test-shell
BATS ist so konfiguriert, dass es JUnit-kompatible Berichte in target/shell_test_reports/ hinterlässt.
Um testbare Shell-Skripte zu schreiben, sollten diese Aspekte beachtet werden:
Es ist eher unüblich, ein Script-under-test wie startup.sh ganz alleine auszuführen. Effektive Unit-Tests werden höchstwahrscheinlich zu einem Albtraum, wenn keine angemessene Skriptstruktur vorhanden ist. Da diese Skripte sich gegenseitig quellen und Code ausführen, muss alles vorher eingerichtet werden: globale Variablen, Mocks von jedem einzelnen aufgerufenen Binary... und so weiter. Letztendlich würden die Tests eher auf einer End-to-End-Testebene als auf einer Unit-Test-Ebene stattfinden.
Die gute Nachricht ist, dass das Testen einzelner Funktionen mit diesen kleinen Teilen möglich ist:
- Sourcing-Ausführungsgarantien verwenden
- Führen Sie Binärdateien und logischen Code nur innerhalb von Funktionen aus
- Sourcen mit (dynamischen, aber fixierten) Umgebungsvariablen
Ermöglichen Sie Sourcing mit sourcing execution guards wie diesem:
# yourscript.sh
function runTheThing() {
echo "hello world"
}
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
runTheThing
fi
Die folgende if-Bedingung wird ausgeführt, wenn das Skript durch einen Aufruf über die Shell ausgeführt wird, aber nicht, wenn es von einer Quelle kommt:
$ ./yourscript.sh
hello world
$ source yourscript.sh
$ runTheThing
hello world
$
Sourcing Execution Guards funktionieren auch mit Parametern:
# yourscript.sh
function runTheThing() {
echo "${1} ${2}"
}
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
runTheThingWithParameters "$@"
fi
Man beachte die korrekte Argumentübergabe mit "$@", die auch Argumente mit Leerzeichen und dergleichen zulässt.
$ ./yourscript.sh hello world
hello world
$ source yourscript.sh
$ runTheThing hello bash
hello bash
$
Umgebungsvariablen und Konstanten sind in Ordnung, aber sobald Logik außerhalb einer Funktion läuft, wird sie während des Skript-Sourcings ausgeführt.