IntroJS でテストファーストを実践してみる
IntroJS の自動テスト機能を使って、テストファーストを実践してみます。
例題として、簡単な足し算プログラムを作ります。
入力データ仕様は、1 行目と 2 行目に整数 1 つずつとします。
出力データ仕様は、入力データの 2 つの整数を足したものを 1行目に 1つ出力するとします。
まず、空のソースコードファイル add.intro を作成しておきます。
def main() end
次に、add.intro ファイルを作成したディレクトリに、case1 ディレクトリを作成します。 そして、その case1 ディレクトリの中に、次のように入力データファイル input.txt を作成します。
1 2
同様に case1 ディレクトリの中に、出力データファイル output.txt を作成します。 足し算プログラムが正しく動作したときの出力データを記述します。 ここでは、入力データの 1 + 2 の結果 3 となります。
3
ここで、一度、自動テストを実行してみます。
introjs -t add.intro
まだ、ソースコードに何も処理を書いていないので、エラーが表示されるはずです。
とりあえず、テストが成功するようにするため、add.intro を次のように修正します。
def main() write_int(3) end
再度、自動テストを実行します。
introjs -t add.intro
今度は、テストが成功するはずです。 ただし、このままでは、他のテストケースでは、うまく動作しないはずです。
もうひとつテストケースを作成するため、case2 ディレクトリを作成し、 その中に input.txt と output.txt を作成します。
case2 の input.txt は次のようにします。
2 3
case2 の output.txt は次のようにします。
5
テストを実行します。
introjs -t add.intro
case 1 は成功しますが、case2 は失敗するはずです。 add.intro を修正して、足し算を正しく計算するプログラムにしましょう。
def main() var a = read_int() var b = read_int() write_int(a + b) end
テストを実行します。
introjs -t add.intro
すべてのテストケースに成功するはずです。
こうして、無事、足し算プログラムをつくることができました。
このように、テストケースを先に作成してから、ソースコードを作成する手法は、テストファーストと呼ばれています。
ということで、整数型しか使えない簡易プログラミング言語 IntroJS は、いかがでしょうか。
IntroJS の自動テスト機能
IntroJS には、競技プログラミング風の自動テスト機能が組み込まれています。
次のようなファイル構成でソースコードとテストデータを作成します。
├─example.intro ├─case1 │ ├─input.txt │ └─output.txt └─case2 ├─input.txt └─output.txt
case ディレクトリは、一つのソースコードについて、複数の case ディレクトリを作成できます。 case ディレクトリの名前は、case1, case2 など case で始めます。
input ファイルは、プログラムの入力となるデータを空白区切りのテキストファイルです。 input ファイルの名前は input.txt のように、input で始めます。
output ファイルは、プログラムが正しく動作したときの出力データを表した空白区切りのテキストファイルです。 output ファイルの名前は output.txt のように、output で始めます。
自動テストを実行するには、次のコマンドを実行します。
introjs -t example.intro
いかがでしょうか。
IntroJS のインストール
IntroJS は、Node.js 上で動作します。 Node.js をインストールして、以下のコマンドを実行してください。
npm install -g introjs
インストールできたことを確認するには、以下のコマンドを実行してみてください。 ヘルプが表示されれば、インストールは成功しています。
introjs -h
メモ帳などのテキストエディタで、以下のようなプログラムを作成してください。 ファイル名は、example.intro としておきます。
def main() write_int(42) end
以下のコマンドを実行して、作成したプログラムを実行します。
introjs example.intro
いかがでしょうか。