Testen auf dem Bash-Track

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.

Exercism CLI

Du brauchst das Kommandozeilen-Tool exercism, um Übungen herunterzuladen und einzureichen. Schau in die Dokumentation zur Exercism CLI.

Wrapper-Funktion für das exercism-Tool

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.

Lokal testen

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 installieren

Du solltest es mit deinem bevorzugten Paketmanager installieren können:

Für Mac (brew)

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
  • Das veraltete bats-Paket gibt es im Homebrew-Ökosystem ebenfalls. Installiere das nicht aus Versehen: installiere bats-core.

Für Linux

Fedora 30 und neuer

bats ist für Fedora 30 und neuer gepackt, du kannst es so installieren:

sudo dnf install bats

Andere Linux-Distributionen

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]
...

Für Windows (MINGW64/Cygwin)

$ 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

bats-assert

Hilfe zur Bedeutung der verschiedenen assert*-Befehle in den Tests findest du in der Dokumentation zur bats-assert-Bibliothek.

Übersprungene Tests

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.

Skips überschreiben

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

Veraltetes 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.