Lerne, wie du deine Bash-Übungen auf Exercism testest
Du kannst den Online-Editor auf der Exercism-Website verwenden, um die Übungen zu lösen. Oder du lädst die Übungen auf deinen Computer herunter, löst sie lokal und reichst sie dann bei Exercism ein. Im Rest dieses Dokuments geht es um das lokale Arbeiten.
Du brauchst das Kommandozeilen-Tool exercism, um Übungen herunterzuladen und einzureichen.
Schau in die Dokumentation zur Exercism CLI.
Ein lästiger Aspekt des standardmäßigen exercism-Tools ist, dass du nach dem Herunterladen einer Übung das Verzeichnis manuell wechseln musst.
Diese Wrapper-Funktion nimmt dir das ab; speichere sie in deiner ~/.bashrc.
exercism () {
local out
readarray -t out < <(command exercism "$@")
printf '%s\n' "${out[@]}"
if [[ $1 == "download" && -d "${out[-1]}" ]]; then
cd "${out[-1]}" || return 1
fi
}
Beachte, dass das kein Shell-Skript sein kann, sondern eine Shell-Funktion sein muss. Shell-Skripte werden in einem Kindprozess ausgeführt und können die Umgebung deiner aktuellen Shell (wie das aktuelle Arbeitsverzeichnis) nicht beeinflussen.
Zum Testen im bash-Track verwenden wir bats.
Führe die Tests für die hypothetische Übung „whatever“ so aus:
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
Wenn du beim lokalen Ausführen der Tests Debug-Ausgaben sehen möchtest, schau dir Lokales Debuggen an.
bats-core installierenDu solltest es mit deinem bevorzugten Paketmanager installieren können:
Unter macOS mit Homebrew sieht das ungefähr so aus:
$ brew install bats-core
==> Downloading https://github.com/bats-core/bats-core/archive/v1.1.0.tar.gz
==> Downloading from https://codeload.github.com/bats-core/bats-core/tar.gz/v1.1.0
######################################################################## 100.0%
==> ./install.sh /usr/local/Cellar/bats-core/1.1.0
🍺 /usr/local/Cellar/bats-core/1.1.0: 13 files, 55KB, built in 4 seconds
bats-Paket gibt es im Homebrew-Ökosystem ebenfalls.
Installiere das nicht aus Versehen: installiere bats-core.bats ist für Fedora 30 und neuer gepackt, du kannst es so installieren:
sudo dnf install bats
Für andere Linux-Distributionen ist die bats-Implementierung, die wir verwenden, möglicherweise nicht bequem gepackt.
Am besten installierst du sie aus dem Quellcode.
Wenn du sie unter /usr/local installieren möchtest, dann
git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local
Danach kannst du, vorausgesetzt /usr/local/bin liegt in deinem $PATH, Folgendes ausführen:
$ bats
Error: Must specify at least one <test>
Usage: bats [-cr] [-f <regex>] [-j <jobs>] [-p | -t] <test>...
bats [-h | -v]
...
$ git clone https://github.com/bats-core/bats-core.git
$ cd bats-core
$ ./install.sh $HOME
Hinweis: Wenn du das veraltete https://github.com/sstephenson/bats.git verwendest und auf einen Fehler wie cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory stößt, musst du den Inhalt des Ordners bin/bats/libexec/ manuell nach ${HOME}/bin/ kopieren.
Es gibt Berichte, dass neuere bats-Versionen unter MinGW bash nicht gut funktionieren. Bevor du das Installationsskript ausführst, möchtest du vielleicht:
$ git checkout v1.1.0
Hilfe zur Bedeutung der verschiedenen assert*-Befehle in den Tests findest du in der Dokumentation zur bats-assert-Bibliothek.
Eine Übung zu lösen bedeutet, dass alle ihre Tests bestehen. Standardmäßig wird nur ein Test (der erste) ausgeführt, wenn du die Tests laufen lässt. Das ist Absicht, denn so kannst du dich darauf konzentrieren, nur diesen einen Test bestehen zu lassen. Sobald er besteht, kannst du den nächsten Test aktivieren, indem du die
[[ $BATS_RUN_SKIPPED == true ]] || skip
-Annotationen auskommentierst oder entfernst, die anderen Tests vorangestellt sind.
Um alle Tests auszuführen, auch die mit skip-Annotationen, kannst du die Umgebungsvariable BATS_RUN_SKIPPED auf den Wert true setzen.
Eine Möglichkeit, das nur für die Dauer des bats-Laufs zu setzen, ist:
BATS_RUN_SKIPPED=true bats exercise_name.bats
Es kann praktisch sein, eine Wrapper-Funktion zu verwenden, um Tipparbeit zu sparen:
bats() {
BATS_RUN_SKIPPED=true command bats *.bats
}
Dann führst du die Tests einfach so aus:
bats
bats
bats-core wurde aus der ursprünglichen bats-Implementierung abgespalten.
Das Projekt sstephenson/bats war ziemlich fehlerhaft und wurde aufgegeben.
Die Verantwortung wurde 2017 übergeben: sstephenson/bats#150 (Kommentar).
Wenn du das ursprüngliche sstephenson/bats installiert hast (prüfe mit bats -v, ob eine Versionsnummer kleiner als 1.0 gemeldet wird), solltest du zu bats-core wechseln; sonst erlebst du vielleicht unerklärliche Testfehler.