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
}

これはシェルの_スクリプト_にはできず、シェルの_関数_でなければならない点に注意してください。 シェルスクリプトは子プロセスで実行されるため、現在のシェルの環境(カレントディレクトリなど)を変更することはできません。

ローカルでのテスト

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
  • 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ライブラリのドキュメントを参照してください。

スキップされるテスト

演習を解くというのは、そのテストをすべて通すということです。 デフォルトでは、テストを実行しても最初の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に切り替えることをおすすめします。そうしないと、原因不明のテスト失敗に遭遇することになります。