DocTestを使ってテスト駆動開発

symfonyには、testの機構が備わっていて、symfony test-allなどで簡単にテストを実行できます。しかしながら、実際にテスト駆動開発(TDD)を行おうと思うと実際書いているソースコードの他にテストを実装しなくてはならず手間が掛かりテストの記述がおろそかになりがちです。

少し困っていたところ、最近になり”/** 〜 */”の中にテストを書くMapleDocTestというのを教えてもらって3日位使ってみたところ、すぐにその簡単さに衝撃を受け、テストの大好きになりました。

しかしながら、PHPでUnitTestのクラスを作成するクラス指向のテスティングに疑問を持ったので独自に関数指向のテストに実装(車輪の再発明!)しなおしてsfDocTestPluginを作成しました。

インストールはtracのwikiを参照してください。

基本はアプリケーション名を指定して以下のように実行します。

symfony doctest-all frontend

プロジェクト中の*.phpファイルをすべてスキャンしてテストします。特定のファイルをテストしたいときには以下のようにします。

symfony doctest frontend hoge.class.php

思いつきで書いたプラグインですので不具合などありましたらご連絡頂けると幸いです。

テストの書き方はMapleDocTestとほぼ同じですが、#eqなどはlimeの関数である#isなどに置き換わります。詳しくは、以前のlimeについてのエントリを参考にしてください。

また、MapleDocTestにある#fなどのマクロはソースコードの可読性が悪くなると判断し実装を控えましたが、要望がありましたら考えます。

実際に、先日作成したsfMobileCarrierJPPluginにテストを実装してみましたので参考までに


DocTestでテストを始めると、ソースコードがテストケースだらけになるのが欠点です。私はemacsを使っているのですがソースコードの可読性を高める為に、以下のelispを.emacsに設定しています。C-c h でソースコードをたたむ事ができます。参考までに。

(load-library "hideshow")
(when (featurep 'hideshow)
  (hs-hide-level 2)
  (add-to-list
   'hs-special-modes-alist
   '(php-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning))
  (define-key php-mode-map '[(control c)(h)] 'php-toggle-hideshow-function)
  (add-hook 'php-mode-hook
	    (lambda () (hs-minor-mode 1))))
 
(defvar php-hs-hide nil "Current state of hideshow for toggling all.")
(defun php-toggle-hideshow-function () "Toggle hideshow all."
  (interactive)
  (setq php-hs-hide (not php-hs-hide))
  (if php-hs-hide
      (save-excursion
	(goto-char (point-min))
	(hs-hide-level 2)
	(goto-char (point-max))
	(while
	    (search-backward "/**")
	  (hs-hide-block)))
    (hs-show-all)))

Leave a Reply

You must be logged in to post a comment.