了解如何在 Exercism 上測試你的 Bash 練習
你可以使用 Exercism 網站上的線上編輯器來解練習。 或者把練習下載到自己的電腦,在本機解完之後再提交到 Exercism。 本文接下來談的都是在本機操作。
你需要exercism命令列工具來下載與提交練習。
請參考 exercism CLI 文件。
預設的 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
你應該可以從自己慣用的套件管理員安裝:
在 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套件。
千萬不要誤裝它:請安裝bats-core。bats已為 Fedora 30 及更新版本打包,你可以用以下指令安裝
sudo dnf install bats
對於其他 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]
...
$ 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
如果想了解測試裡各種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;否則你可能會遇到不明所以的測試失敗。