在 Bash 軌道上測試

了解如何在 Exercism 上測試你的 Bash 練習


你可以使用 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
}

請注意,它不能是 shell 的 腳本,必須是 shell 的 函式。 Shell 腳本是在子行程中執行的,無法影響你目前 shell 的環境(例如目前的工作目錄)。

在本機測試

在 bash track 上測試時,我們使用的是 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
  • homebrew 生態系統裡也有舊版的bats套件。 千萬不要誤裝它:請安裝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是從最初的bats實作分支出來的。 sstephenson/bats這個專案有不少 bug,而且早已被棄置。 所有權在 2017 年移交:sstephenson/bats#150(留言)。

如果你安裝的是最初的 sstephenson/bats(用bats -v檢查,如果回報的版本號小於 1.0),就應該改用 bats-core;否則你可能會遇到不明所以的測試失敗。