ExercismでYAMLScriptの演習をテストする方法を学びます
YAMLScriptで書かれたExercismの演習の解答をテストするのは、とても簡単です。実行も簡単で、理解も簡単です。
演習のディレクトリでmake testを実行するだけです。
最初にmake testを実行したときは、テストを解くコードをまだ書いていないので、すべてのテストが失敗します。
通常の演習の進め方は、まずmake testを実行し、それから一度に1つのテストに集中して、そのテストに合格するコードを書いていくというものです。すべてのテストに合格したら、完了です!
おまけとして、make testを実行すると、正しいバージョンのys YAMLScriptインタプリター(現在の演習で必要なもの)が正しい場所(/path/to/exercism/yamlscript/.local/)にインストールされていることも確認されます。つまり、始める前にysをインストールしておく必要すらありません!
the-great-exerciseという演習に取り組んでいるとすると、exercism download --exercise=the-great-exercise --track=yamlscriptを実行すると、/path/to/exercism/yamlscript/the-great-exerciseというディレクトリが作成されます。
このディレクトリの中では、テストファイルはthe-great-exercise-test.ys、解答プログラムのファイルはthe-great-exercise.ysという名前になります。また、演習の説明が書かれたREADME.mdと、行き詰まったときに役立つ情報が書かれたHELP.mdもあります。
make用のファイルはMakefileとGNUmakefileの2つです。これは、システムにインストールされているかもしれない別のmakeコマンドではなく、GNU makeでテストを実行することを(npi)確実にするためのものです。本物はGNUmakefileで、GNU makeは常にMakefileよりこちらを優先します。他のmakeコマンドはMakefileを使いますが、これはGNU makeを使うように促すメッセージとともにエラーになるはずです!
YAMLScriptのテストは、もちろんYAMLScriptで書きます! YAMLScriptはYAMLで、YAMLはデータですから、テストは基本的にただのデータです。
簡単なテストファイルの例を挙げます。実はこれはacronymの演習の最初の3つのテストです。:-)
#!/usr/bin/env ys-0
use ys::taptest: :all
load: 'acronym.ys'
test::
- name: Basic
code: abbreviate('Portable Network Graphics')
want: PNG
- name: Lowercase words
code: abbreviate('Ruby on Rails')
want: ROR
- name: Punctuation
code: abbreviate('First In, First Out')
want: FIFO
done: 3
1行目はシバン行で、proveコマンド(Makefileから実行されます)に対して、proveのデフォルトであるperlの代わりに、YAMLScriptのysインタプリターでテストを実行するよう指示します。
2行目はuse文で、YAMLScriptのys::taptestというTAPテストライブラリを読み込みます。
注: TAPはテストスクリプトとテストハーネスの間のシンプルなテキストベースのインターフェースで、
proveはPerlでTAPテストを実行するための標準的なハーネスです。Perlはどこにでもあるので、多くの言語(YAMLScriptを含む)のテストスイートにとって、TAPとproveを使うのはとても良い選択になります。
use文でacronym.ysの解答プログラムを読み込むことで、このテストファイルがテストする対象が用意されます。
テストはすべて、testキーの下のYAMLシーケンスに入っています。
最後の行のdone:は必須で、すべてのテストが実際に実行されたことをテストハーネスに伝えます。数値(省略可能)は、実行されると想定していたテストの数です。
各テスト(testキーの下)は、次のキーと値のペアを持つマッピングです。
name: - prove -vで表示されるテストのラベルです。code: - 実行するYAMLScriptのコードです。
このコードは、取り組んでいる解答プログラムの何らかの関数を呼び出します。what: - エラーの発生を期待するテストでは、値はerrorです。
通常のテストでは、このペアはありません。want: - テストで期待される結果です。
これはYAMLの値で、文字列、数値、真偽値、シーケンス、マッピングのいずれかです。
what:がerrorの場合、この値は期待されるエラーメッセージです。SKIP: - そのテストの実行をスキップするには、これをtrueにします。ONLY: - そのテストだけを実行するには、これをtrueにします。
ONLY:のテストが複数ある場合は、そのすべてが実行されます。これで、Exercismの演習をYAMLScriptでテスト駆動開発するために知っておくべきことは、すべてのはずです!
ys::taptestライブラリには、もっと複雑なテストを書くために使える他の機能もありますが、Exercismのテストはすでに用意されています。ys::taptestライブラリについてもっと知りたい場合は、ドキュメントを参照してください。