Testing στη διαδρομή Bash

Μάθε πώς να δοκιμάζεις τις ασκήσεις σου σε Bash στο Exercism


Μπορείς να χρησιμοποιήσεις τον διαδικτυακό επεξεργαστή στην ιστοσελίδα του Exercism για να λύσεις τις ασκήσεις. Ή κατέβασε τις ασκήσεις στον υπολογιστή σου, λύσέ τις τοπικά και μετά υπόβαλέ τις στο Exercism. Το υπόλοιπο αυτού του εγγράφου αφορά την τοπική εργασία.

Exercism CLI

Θα χρειαστείς το εργαλείο γραμμής εντολών exercism για να κατεβάσεις και να υποβάλεις ασκήσεις. Δες την τεκμηρίωση του Exercism CLI.

Συνάρτηση-περιτύλιγμα για το εργαλείο exercism

Ένα ενοχλητικό σημείο του προεπιλεγμένου εργαλείου exercism είναι ότι, αφού κατεβάσεις μια άσκηση, πρέπει να αλλάξεις κατάλογο χειροκίνητα. Αυτή η συνάρτηση-περιτύλιγμα το κάνει για σένα. Αποθήκευσέ την στο ~/.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
}

Σημείωσε ότι δεν μπορεί να είναι σενάριο κελύφους, πρέπει να είναι συνάρτηση κελύφους. Τα σενάρια κελύφους εκτελούνται σε θυγατρική διεργασία και δεν μπορούν να επηρεάσουν το περιβάλλον (όπως τον τρέχοντα κατάλογο εργασίας) του τρέχοντος κελύφους σου.

Τοπικές δοκιμές

Για τις δοκιμές στη διαδρομή bash χρησιμοποιούμε το bats.

Τρέξε τις δοκιμές για την υποθετική άσκηση "whatever" κάπως έτσι:

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

Αν θέλεις να εκτυπώσεις έξοδο αποσφαλμάτωσης όταν τρέχεις τις δοκιμές τοπικά, δες Αποσφαλμάτωση τοπικά.

Εγκατάσταση του bats-core

Θα πρέπει να μπορείς να το εγκαταστήσεις από τον αγαπημένο σου διαχειριστή πακέτων:

Για Mac (brew)

Στο macOS με το Homebrew θα έμοιαζε κάπως έτσι:

$ 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 υπάρχει επίσης στο οικοσύστημα του Homebrew. Μην το εγκαταστήσεις κατά λάθος: εγκατέστησε το bats-core.

Για Linux

Fedora 30 και νεότερες

Το bats υπάρχει σε πακέτο για Fedora 30 και νεότερες, μπορείς να το εγκαταστήσεις με

sudo dnf install bats

Άλλες διανομές Linux

Για άλλες διανομές Linux, η υλοποίηση του bats που χρησιμοποιούμε μπορεί να μην υπάρχει σε βολικό πακέτο. Ο καλύτερος τρόπος να το εγκαταστήσεις είναι από τον πηγαίο κώδικα. Αν θέλεις να το εγκαταστήσεις στο /usr/local, τότε

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

Στη συνέχεια, αν υποθέσουμε ότι το /usr/local/bin είναι στο $PATH σου, μπορείς τώρα να τρέξεις:

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

Για Windows (MINGW64/Cygwin)

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

Σημείωση: Όταν χρησιμοποιείς το παρωχημένο https://github.com/sstephenson/bats.git και ανακαλύψεις ένα σφάλμα σαν το cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory, πρέπει να αντιγράψεις χειροκίνητα το περιεχόμενο του φακέλου bin/bats/libexec/ στο ${HOME}/bin/.

Υπάρχουν αναφορές ότι οι νεότερες εκδόσεις του bats δεν συμπεριφέρονται καλά στο MinGW bash. Πριν τρέξεις το σενάριο εγκατάστασης, ίσως θέλεις να τρέξεις:

$ git checkout v1.1.0

bats-assert

Για βοήθεια σχετικά με τη σημασία των διάφορων εντολών assert* στις δοκιμές, δες την τεκμηρίωση της βιβλιοθήκης bats-assert.

Δοκιμές που παραλείπονται

Το να λύσεις μια άσκηση σημαίνει να κάνεις όλες τις δοκιμές της να περάσουν. Από προεπιλογή, όταν τρέχεις τις δοκιμές εκτελείται μόνο μία δοκιμή (η πρώτη). Αυτό γίνεται σκόπιμα, ώστε να μπορείς να επικεντρωθείς στο να περάσει μόνο αυτή η μία δοκιμή. Μόλις περάσει, μπορείς να ενεργοποιήσεις την επόμενη δοκιμή σχολιάζοντας ή αφαιρώντας τις

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

σημειώσεις που προηγούνται των υπόλοιπων δοκιμών.

Παράκαμψη των παραλείψεων

Για να τρέξεις όλες τις δοκιμές, μαζί και αυτές με σημειώσεις skip, μπορείς να ορίσεις τη μεταβλητή περιβάλλοντος BATS_RUN_SKIPPED στην τιμή true. Ένας τρόπος να το ορίσεις μόνο για τη διάρκεια εκτέλεσης του bats είναι:

BATS_RUN_SKIPPED=true bats exercise_name.bats

Μπορεί να σου φανεί βολικό να χρησιμοποιήσεις μια συνάρτηση-περιτύλιγμα για να γλιτώσεις πληκτρολόγηση:

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

Έπειτα τρέξε τις δοκιμές απλώς με:

bats

Το παλιό bats

Το bats-core δημιουργήθηκε ως fork του αρχικού bats. Το έργο sstephenson/bats είχε αρκετά bugs και είχε εγκαταλειφθεί. Η ιδιοκτησία πέρασε σε άλλα χέρια το 2017: sstephenson/bats#150 (σχόλιο).

Αν έχεις εγκατεστημένο το αρχικό sstephenson/bats (έλεγξέ το με bats -v, αν αναφέρει αριθμό έκδοσης μικρότερο του 1.0), τότε καλό είναι να περάσεις στο bats-core. Αλλιώς, μπορεί να βρεθείς αντιμέτωπος με ανεξήγητες αποτυχίες δοκιμών.