Testare sul track di Bash

Scopri come testare gli esercizi di Bash su Exercism


Puoi usare l'editor online sul sito di Exercism per risolvere gli esercizi. Oppure scarica gli esercizi sul tuo computer, risolvili in locale e poi inviali a Exercism. Il resto di questo documento parla di come lavorare in locale.

Exercism CLI

Ti servirà lo strumento da riga di comando exercism per scaricare e inviare gli esercizi. Vedi la documentazione della CLI di exercism.

Funzione wrapper per lo strumento exercism

Un aspetto fastidioso dello strumento exercism predefinito è che, dopo aver scaricato un esercizio, devi cambiare manualmente directory. Questa funzione wrapper se ne occupa al posto tuo; salvala nel tuo ~/.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
}

Nota che non può essere uno script di shell, deve essere una function di shell. Gli script di shell vengono eseguiti in un processo figlio e non possono influire sull'ambiente (come la directory di lavoro corrente) della tua shell attuale.

Test in locale

Per i test sul track Bash, usiamo bats.

Esegui i test per il fantomatico esercizio «whatever» in questo modo:

cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats

Se vuoi stampare l'output di debug mentre esegui i test in locale, vedi Debug in locale.

Installare bats-core

Dovresti riuscire a installarlo dal tuo gestore di pacchetti preferito:

Per Mac (brew)

Su macOS con Homebrew dovrebbe essere qualcosa del genere:

$ 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
  • Nell'ecosistema homebrew esiste anche il pacchetto bats legacy. Non installarlo per sbaglio: installa bats-core.

Per Linux

Fedora 30 e versioni successive

bats è disponibile come pacchetto per Fedora 30 e versioni successive, puoi installarlo con

sudo dnf install bats

Altre distribuzioni Linux

Per altre distribuzioni Linux, l'implementazione di bats che usiamo potrebbe non essere disponibile in pacchetti comodi. Il modo migliore per installarla è dai sorgenti. Se vuoi installarla in /usr/local, allora

git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local

Fatto questo, supponendo che /usr/local/bin sia nel tuo $PATH, ora puoi fare:

$ bats
Error: Must specify at least one <test>
Usage: bats [-cr] [-f <regex>] [-j <jobs>] [-p | -t] <test>...
       bats [-h | -v]
...

Per Windows (MINGW64/Cygwin)

$ git clone https://github.com/bats-core/bats-core.git
$ cd bats-core
$ ./install.sh $HOME

Nota: se stai usando il vecchio https://github.com/sstephenson/bats.git e ti imbatti in un errore come cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory, devi copiare manualmente il contenuto della cartella bin/bats/libexec/ in ${HOME}/bin/.

Ci sono segnalazioni che le versioni più recenti di bats non funzionano bene su MinGW bash: prima di eseguire lo script di installazione, potresti voler fare:

$ git checkout v1.1.0

bats-assert

Per capire il significato dei vari comandi assert* nei test, fai riferimento alla documentazione della libreria bats-assert.

Test saltati

Risolvere un esercizio significa far passare tutti i suoi test. Per impostazione predefinita, quando esegui i test viene eseguito un solo test (il primo). È intenzionale: ti permette di concentrarti solo sul far passare quel singolo test. Una volta che passa, puoi abilitare il test successivo trasformando in commento o rimuovendo le

[[ $BATS_RUN_SKIPPED == true ]] || skip

annotazioni che precedono gli altri test.

Sovrascrivere gli skip

Per eseguire tutti i test, compresi quelli con l'annotazione skip, puoi impostare la variabile d'ambiente BATS_RUN_SKIPPED al valore true. Un modo per impostarla solo per la durata dell'esecuzione di bats è:

BATS_RUN_SKIPPED=true bats exercise_name.bats

Può essere comodo usare una funzione wrapper per risparmiare digitazione:

bats() {
    BATS_RUN_SKIPPED=true command bats *.bats
}

Poi esegui i test semplicemente con:

bats

bats legacy

bats-core è nato come fork di l'implementazione originale di bats. Il progetto sstephenson/bats era piuttosto pieno di bug ed era stato abbandonato. La proprietà è stata ceduta nel 2017: sstephenson/bats#150 (commento).

Se hai installato l'originale sstephenson/bats (controlla con bats -v: se riporta un numero di versione inferiore a 1.0), allora dovresti passare a bats-core; altrimenti potresti ritrovarti a subire inspiegabili fallimenti dei test.