[編集]REPLを持ったプログラミング言語処理系における原始的かつボトムアップな開発手順について考えよう。小さな関数(だとか)を書く。そこでREPLを起動してソースをロードし、関数に対して入力を与え、結果を見る。そこで異常な入力に対するハンドリングを関数内に追加して、異常処理がうまくいくことを見る。さっきの正常系の処理が変わったりしていないだろうか。そこでESCに続けてkを何度か押して(またはCtrl+Pを何度か押して)履歴から正常系の入力の式を復元してもう1回確認してみる。関数の実装がちょっと気に入らないので変更する。さっきまで動いていた分はまだ正しく動くだろうか。そこでまた履歴から入力式を復元して叩いてみる。この試行錯誤の中には「テスト」をしている箇所がある。REPLの履歴とプログラマの短期記憶の中だけにあって、しばらくすると消えてしまう。テスト駆動開発、あるいは単に「単体テストを書く」ことは不揮発なテストによってコードの品質を保とうとする習慣である。そこではREPLでアドホックにテストをするのではなくてテスティングフレームワークの定める形でテストコードを書く。テストはことあるごとに自動で繰り返し実行される。コードの変更が何かを壊していたらすぐにわかるし、いま現在のコードがすべてのテストを通過しているという確証を得ることができる。我々はそもそも最初からREPLなんて使うべきではなかったのだろうか。長期的に見てテスティングフレームワークを使用すべきことは明らかだ。REPLにも良い点はある。「とにかく入力を与えてみて、結果を見る。いう関係になっている場合が多い。「良い習慣」より敷居が低いことは事実だ。問題はREPL上の作業とテスティングフレームワークで単体テストを書くこととの間の距離だ。敷居の低いREPLで行った「テスト」を不揮発にしたくなった段階で、その距離が問題になる。さっきまでのREPLに打っていた式ではなくて、テスティングフレームワーク上のアサーションを書かなければならなくなるのだ。ここにフィットするテスティングフレームワークだ。Rehearsalにおける単体テストはREPLのセッションそのものである。SML/NJでgreet.smlというテスト対象のプログラムを作り、次のようなREPLセッションを行ったとする。unitこのセッションを不揮発にするには、コピーアンドペーストで次のファイルを作る。いうファイル名で保存したとすると、テストを再実行するには次のコマンドを打つ。このコマンドはもちろんMakefileなどに書いておけばよい。consoleRehearsalはREPLがなんであるかは問わない。シェルでもよいしPythonでもScalaでもよい。XML形式の出力ができるのでJenkinsなどに集計させることもできる。Reharsalのテストスクリプトの文法はMarkdownに合わせている。「Markdownで書かれたその言語のチュートリアル」をそのままテストとして実行することもできる。Python)REPLをそのままテストにすることの良い副作用として、プリティプリンタが得られる点がある。SMLでは(Javaのような言語とは違って)値を文字列に変換する関数は一般的には手に入らず、自分で書かなければならない。(期待値と実際の値の比較をエラーメッセージの中に含むために使われる)。これは合理的ではあるもののREPLと単体テストの間の距離を一層離すことにつながっている。SMLでもREPLを使うならばそのような面倒くささはない。プログラマがREPLでテストをするときはREPLが出してくれたものを目で見て妥当性を判断しているからだ。このようにRehearsalのアプローチはREPLの気軽さを損ねずに自動的な回帰テストの利点を取り入れることができる。した方法が「とにかく自動的な回帰テストを回し始める最初の一歩」を容易にすると考えている。トラックバック(0)あなたは既にnice!を行っています。一定件数以上前のnice!は表示されませんのでご了承ください。0コメントを書くコメント投稿に失敗しました。未入力の項目があります。認証コードが一致しませんでした。半角英数字のみのコメントは受け付けできません。お名前:URL:コメント:画像認証:下の画像に表示されている文字を入力してください。(..単体テストのための外部DSLカテゴリーOCaml(62)Tcl(27)D言語(5)COM(1)PowerShell(9)JavaScript(5)Linux(2)Lua(19)XSLT(1)Lisp(32)Excel(2)コードリーディング(4)Ruby(9)言語比較(7)Haskell(6)Groovy(1)PHP(10)Scala(48)Perl(2)Erlang(4)Python(2)Prolog(8)Java(8)自然言語(1)awk(1)SML(19)sh(2)SMV(1)YokohamaUnit(8)Rehearsal(1)Isabelle(1)最近のコメント不本意というよりは意外、というのが..ご案内ありがとうございます。..ご紹介&コメントありがとうございま..OCaml3.11のCamlp4か..エラー出た時はここが参考になりまし..コメントありがとうございます。SML#のバグ報..コメントありがとうございます。ソネットポイントこの広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。この広告は180日新規投稿のないブログに表示されます。