YAMLScriptトラックでのテスト

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ライブラリについてもっと知りたい場合は、ドキュメントを参照してください。