- この章の記述はすごいなぁ、と思う。おお、CLだとこういう風なプログラミングになるんだ、ということがありありと描写されている。
- ここでは、このユニットテストフレームワークをどう使うか、使えるかという観点で整理する。
- REPLの場合
;; システムのインストール
(asdf:oos 'asdf:load-op :test-framework)
;; 名前のインポート
(use-package :com.gigamonkeys.test)
;; テストを少し書く。仕様の記述にもなる。
(deftest test-fact ()
(check
(= (fact 0) 1)
(= (fact 1) 1)
(= (fact 2) 2)
(= (fact 5) 120)))
;; プロトタイプ関数を書く。
(defun fact (n) 0)
;; テストにかける。
(test-fact)
FAIL ... (TEST-FACT): (= (FACT 0) 1)
FAIL ... (TEST-FACT): (= (FACT 1) 1)
FAIL ... (TEST-FACT): (= (FACT 2) 2)
FAIL ... (TEST-FACT): (= (FACT 5) 120)
NIL
;; テストをpassするように関数を書いていく。
;; さて別の関数を作る。
;; テストを書く。
(deftest test-memberp ()
(check
(eql (memberp nil nil) nil)
(eql (memberp '(nil) nil) t)
(eql (memberp '(a) 'a) t)
(eql (memberp nil 'a) nil)
(eql (memberp '(b) 'a) nil)))
;; プロトタイプ関数を書いて、すべてのテストが通るまで作業、作業中もテストを足したりする。
(defun memberp (x atom)
(and (consp x)
(not (null x))
(if (atom (car x))
(or (eql (car x) atom)
(memberp (cdr x) atom))
(or (memberp (car x) atom)
(memberp (cdr x) atom)))))
;; 2つの関数のテスト達ができたので、まとめる。
(deftest test-myfunc ()
(com.gigamonkeys.test::combine-results
(test-fact)
(test-memberp)))
;; ここで、combine-resultsがexternalでないのがうざい。externalとして改変すべきかも。 - ASDFを使っていないソースファイルの場合
- cl-userで構築していくとする。
- テストコードは本体ソース内に書くルールとする。
- テストコードを完成版から削除する場合は、テスト用の式はすべて#+testというfeatureにする。featureのon/offは例えば次。
(push :test *features*)
(setf *features* (delete :test *features*)) - 使い方の例はこんな感じ。
(in-package :user)
#+test
(progn
(print "test feature active")
(require 'asdf)
(asdf:oos 'asdf:load-op :test-framework)
(use-package :com.gigamonkeys.test))
;;; =======================================
(defun fact (n)
(cond
((= n 0) 1)
(t (* n (fact (1- n))))))
#+test
(deftest test-fact ()
(check
(= (fact 0) 1)
(= (fact 1) 1)
(= (fact 2) 2)
(= (fact 5) 120)))
(defun memberp (x atom)
(and (consp x)
(not (null x))
(if (atom (car x))
(or (eql (car x) atom)
(memberp (cdr x) atom))
(or (memberp (car x) atom)
(memberp (cdr x) atom)))))
#+test
(deftest test-memberp ()
(check
(eql (memberp nil nil) nil)
(eql (memberp '(nil) nil) t)
(eql (memberp '(a) 'a) t)
(eql (memberp nil 'a) nil)
(eql (memberp '(b) 'a) nil)))
;;; =======================================
#+test
(deftest test-myfunc ()
(com.gigamonkeys.test::combine-results
(test-fact)
(test-memberp)))
#+test
(test-myfunc)
- cl-userで構築していくとする。
- このユニットテストフレームワークの鑑評
- 方向性としてはルールベースプログラミング。
- ただしインタプリタ方式ではなくコンパイラ方式。
- CLの標準にないけどシンプルな構文構造についてマクロを書いて抽象化している。
- 方向性としてはルールベースプログラミング。
こつこつ。
0 件のコメント:
コメントを投稿