読者です 読者をやめる 読者になる 読者になる

Common Lisp でごく基本的なテストを書くことについてのチュートリアル

テストの基本

1 + 1 を評価した値が本当に 2 かどうか知りたいとしましょう。
Lisp では (+ 1 1) という風に書き、すぐにこのコードを REPL を使って確かめることができます。 あなたが CLISP をパソコンにインストールしているなら:

% clisp

と打つことで REPL*1 ループに身を置くことができます。
では先ほどのコードを打ってみましょう:

[1]> (+ 1 1)
2

見ましたか?
なんと、答えは 2 です*2!!

でも、眼で視るのはめんどくさいですよね。
ここで使えるのが equal という関数です。
使ってみましょう:

[2]> (equal (+ 1 1) 2)
T

T というのは真を表すリテラルです。 今は -modern というコマンドラインオプションをつけていないので昔風にシンボルが大文字で表示されているのです。
CLISP の REPL を終了する時は:

[3]> (exit)
Bye.

と打ってください。
CLISP がさよならと云って終了します。

めんどくさい

でも、どんなコードも REPL でテストするなんてめんどくさいですよね。
そこで使われるのがテストフレームワーク*3です。
テストのメッカ、Perl 文化では Test::Simple という簡単なライブラリがあります。
幸運なことに test:simple があります。
これは Test::Simple にインスパイアされた Common Lisp 製のライブラリ*4です。

test:simple には ok という 1 つの関数があります:

#!/usr/bin/env clisp
(require 'test:simple)

(tests 1)

(ok (equals (+ 1 1) 2))

これは上のコードと同じことをします。
ここからは、自分で ok や not ok を書く代わりに ok を遣います。 ok が真を返せば、テストは合格ということです。偽なら失敗です。

#!/usr/bin/env clisp
(require 'test:simple)

(tests 2)

(ok (equals (+ 1 1) 2))
(ok (equals (+ 2 2) 5))

このコードを評価すると、このような出力になるはずです:

1..2
ok 1
not ok 2
#    failed test (demo-test-simple.lisp at line 7)
# looks like you failed 1 tests of 2.

この出力の意味はこうです:

1..2

1 行目は「2 つのテストを行う」ということを表します。

ok 1

2 行目は 1 番目のテスト結果が表示されています。

not ok 2

3 行目は 2 番目のテスト結果が表示されています。

#    failed test (demo-test-simple.lisp at line 7)
# looks like you failed 1 tests of 2.

4 行目はテストが失敗した箇所を表し、5 行目では 2 つのテストのうち、1 つが失敗したことを知らせています。

怖くはありませんよ。さあ、お薬を飲みましょう……。

(l ω l〃) とここまで書いてなんなんですが、よく分からない理由により、脚注が出なくなっております……
       このため、書く気が非常に失せております

╰( ´◔ ω ◔ `)╯ と思ったら、バックスラッシュ 3 つのソースコード記法を使うと良くないみたいだな…

(l ω l〃) さっぱりわからないよ……

参考

*1:Read-eval-print-loop の略。 つまり、入力を読み込んで、評価して、表示するループのこと

*2:誰でも知っている*常識*ですねw ここではそうなるはずのことを大げさに驚いてみせるというユーモアあふれる技法を使っています。

*3:フレームワークとライブラリの違いは曖昧ですが、ここでは同じ意味で使っています。

*4:あくまでも、この test:simple は私の勉強用に書かれるライブラリです。 多分、同じようなものがどこかにあると思われます。