Tesztelés a Bash-kurzuson

Tanuld meg, hogyan tesztelheted a Bash-feladataidat az Exercism-ön


A feladatokat az Exercism weboldalán található online szerkesztőben is megoldhatod. Vagy letöltheted a feladatokat a számítógépedre, megoldhatod őket helyben, majd beküldheted az Exercism-re. A dokumentum további része a helyi munkáról szól.

Exercism CLI

A feladatok letöltéséhez és beküldéséhez szükséged lesz a exercism parancssori eszközre. Lásd az Exercism CLI dokumentációját.

Burkolófüggvény az exercism eszközhöz

Az alapértelmezett exercism eszköz egyik bosszantó tulajdonsága, hogy miután letöltöttél egy feladatot, kézzel kell átváltanod a megfelelő könyvtárba. Ez a burkolófüggvény elintézi ezt helyetted; mentsd el a ~/.bashrc fájlodba.

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
}

Vedd figyelembe, hogy ez nem lehet shell-script, csak shell-függvény. A shell-scriptek egy gyermekfolyamatban futnak, és nem tudják módosítani a jelenlegi shelled környezetét (például az aktuális munkakönyvtárat).

Helyi tesztelés

A bash kurzus teszteléséhez a bats eszközt használjuk.

A hipotetikus „whatever” feladat tesztjeit így futtathatod:

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

Ha a tesztek helyi futtatása közben debugkimenetet szeretnél kiíratni, nézd meg a Helyi hibakeresés oldalt.

A bats-core telepítése

Valószínűleg telepíthető a kedvenc csomagkezelőddel:

Mac esetén (brew)

macOS-en a Homebrew eszközzel ez valahogy így néz ki:

$ 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
  • A régi bats csomag is létezik a Homebrew ökoszisztémájában. Ne telepítsd véletlenül azt: a bats-core csomagot telepítsd.

Linux esetén

Fedora 30 és újabb

A bats csomag elérhető a Fedora 30 és újabb verzióihoz, így telepítheted:

sudo dnf install bats

Egyéb Linux-disztribúciók

Más Linux-disztribúciók esetén előfordulhat, hogy az általunk használt bats nincs kényelmesen csomagolva. A legjobb, ha forrásból telepíted. Ha a /usr/local alá szeretnéd telepíteni, akkor:

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

Ezután, feltéve hogy a /usr/local/bin benne van a $PATH-ben, ezt teheted:

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

Windows esetén (MINGW64/Cygwin)

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

Megjegyzés: ha az elavult https://github.com/sstephenson/bats.git címről telepítesz, és ilyen hibát kapsz: cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory, akkor a bin/bats/libexec/ mappa tartalmát kézzel kell a ${HOME}/bin/ könyvtárba másolnod.

Több jelentés is szól arról, hogy az újabb bats-verziók nem viselkednek jól a MinGW bash alatt; mielőtt lefuttatod a telepítőszkriptet, érdemes lehet ezt megtenned:

$ git checkout v1.1.0

bats-assert

Hogy mit jelentenek a tesztekben a különféle assert* parancsok, arról a bats-assert könyvtár dokumentációjában olvashatsz.

Kihagyott tesztek

Egy feladat megoldásához minden tesztjének sikeresnek kell lennie. Alapértelmezés szerint a tesztek futtatásakor csak egy teszt (az első) fut le. Ez szándékos, mert így arra összpontosíthatsz, hogy csak azt az egy tesztet tedd sikeressé. Miután sikeres lesz, a következő tesztet úgy engedélyezheted, hogy kikommenteled vagy eltávolítod a

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

jelöléseket, amelyek a többi teszt elé vannak fűzve.

A kihagyások felülírása

Ha az összes tesztet, köztük a skip jelöléssel ellátottakat is futtatni szeretnéd, állítsd a BATS_RUN_SKIPPED környezeti változót true értékre. Az egyik módja, hogy ezt csak a bats futásának idejére állítsd be:

BATS_RUN_SKIPPED=true bats exercise_name.bats

Kényelmes lehet egy burkolófüggvény használata, hogy kevesebbet kelljen gépelned:

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

Ezután a teszteket már csak így futtathatod:

bats

A régi bats

A bats-core az eredeti bats implementáció forkjaként jött létre. A sstephenson/bats projekt meglehetősen hibás volt, és elhagyták. A tulajdonjog 2017-ben került át: sstephenson/bats#150 (hozzászólás).

Ha az eredeti sstephenson/bats van telepítve (ellenőrizd, hogy a bats -v 1.0-nál kisebb verziószámot ír-e ki), akkor válts a bats-core-ra; különben könnyen belefuthatsz megmagyarázhatatlan teszthibákba.