まだ途中です。あとでさらに手を入れる予定。
DSLだってやっぱりテストしたい!
テスト駆動開発が大好きな私としては、当然DSLもテストしたい。ということでDSLのテストについて考えてみた。
セマンティックモデルのテストとして行うのは、モデルに値を投入したときに期待通りの出力が得られるかどうかを確かめること。このテストにはパーサーやDSLスクリプトは不要で、モデルのインターフェイスに直接アクセスすればよい。
先に示したシークレットパネルコントローラを例にして考えてみよう。このセマンティックモデル(ステートマシン)をテストするには、"導入" の最初に示したコードが使える。
@Test public void eventCausesTransition() { State idle = new State("idle"); StateMachine machine = new StateMachine(idle); Event cause = new Event("cause", "EV01"); State target = new State("target"); idle.addTransition(cause, target); Controller controller = new Controller(machine, new CommandChannel()); controller.handle("EV01"); assertEquals(target, controller.getCurrentState()); }
……が、実際にはもう少し手直しすることになるだろう。
DSLスクリプトだって立派なコードだ。「シンプルで明白なので敢えてテストするまでもない」とか言う人もいるけど、TDD大好きな私としては当然スクリプトもテストしたい。
スクリプトのテスト方法として一般的なのは、テキストのフィクスチャを作れるような環境を作ってスクリプトを実行し、その結果を比較するというもの。
スクリプトのテストは、統合テストとしても使える。もしパーサーやセマンティックモデルに問題があれば、スクリプトのテストも失敗するからだ。