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
}
これはシェルの_スクリプト_にはできず、シェルの_関数_でなければならない点に注意してください。 シェルスクリプトは子プロセスで実行されるため、現在のシェルの環境(カレントディレクトリなど)を変更することはできません。
bashトラックのテストには、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ライブラリのドキュメントを参照してください。
演習を解くというのは、そのテストをすべて通すということです。 デフォルトでは、テストを実行しても最初の1つだけが実行されます。 これは意図的なもので、まずはその1つのテストを通すことに集中できます。 それが通ったら、他のテストの前に付けられている
[[ $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プロジェクトにはかなりのバグがあり、放棄されていました。
2017年に所有権が引き継がれました:sstephenson/bats#150(コメント)。
元のsstephenson/batsがインストールされている場合(bats -vで表示されるバージョンが1.0未満かどうかで確認できます)は、bats-coreに切り替えることをおすすめします。そうしないと、原因不明のテスト失敗に遭遇することになります。