(apply-generic op . args)

教育者, 将軍, 栄養士, 心理学者, 親はプログラムする. 軍隊, 学生, 一部の社会はプログラムされる. - 計算機プログラムの構造と解釈 序文

Common LispのTestingFrameworkを2つほど触ってみる

昨日に引き続きCLネタです。

引っ越しの準備で大江戸Ruby会議に行けなくて寂しいので、家で一人でLISP妖精さんとお話して*1戯れて寂しさを紛らわせています。

で、CLでも当たり前の如くテスト書きたいよねーってことで http://quickdocs.org/ でライブラリを調べて、取り敢えず2つ試して見ました。

当然のごとくVimで書いていますemacsLISPとか今どきないわー(煽 *2

CL-TEST-MORE

perlのtest-moreに影響を受けているとのこと。 perlわからんので似てる〜とか言えない。 僕的にはあまり馴染みのない感じでしたけどとてもわかり易かったです。

;;; CL-TEST-MORE
(ql:quickload :cl-test-more)
(in-package :cl-test-more)

(print "ok Function")
(ok (eq 1 1) "description") ; ok
(ok (eq 1 2) "description") ; not ok

(print "is Function")
(is 1 1 "description") ; ok
(is 1 2 "description") ; not ok

(print "isnt Function")
(isnt 1 2 "description") ; ok
(isnt 1 1 "description") ; not ok

(defun fib (n) (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))
(print "TEST Fibonacci Function")
(is (fib 0) 0)
(is (fib 1) 1)
(is (fib 2) 1)
(is (fib 3) 2)
(is (fib 4) 3)
(is (fib 5) 5)
(is (fib 6) 8)

詳しくはこちら

lisp-unit

こっちのほうが僕の好みでした。 個人的に何か開発するときはこっちを使うかな。

;;; LISP-UNIT
(ql:quickload :lisp-unit)
(in-package :lisp-unit)

(define-test fib
   (assert-equal 0 (fib 0))
   (assert-equal 1 (fib 1))
   (assert-equal 1 (fib 2))
   (assert-equal 2 (fib 3))
   (assert-equal 3 (fib 4))
   (assert-equal 5 (fib 5))
   (assert-equal 8 (fib 6)))

(defun fib (n) (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))
(run-tests '(fib))

(define-test my-sqrt
   (dotimes (i 5)
      (assert-equal i (my-sqrt (* i i)))))

(defun my-sqrt (n) (/ n 2)) ; これはテストコケます
(run-tests '(my-sqrt))

(run-tests :all)

詳しくはこちら

*1:ダグラス・ホフスタッターによるとREPL(対話型評価環境)の>や?はLISPの妖精で、REPLを使うことはLISPの妖精との対話である(ダグラス・ホフスタッター頭良すぎてぶっ飛んでる) メタマジック・ゲーム―科学と芸術のジグソーパズル

*2:冗談なのでマサカリ禁止