Born Too Late

Yuya's old tech blog.

PHPUnit によるテスト駆動開発 #01 インストール編

2010-07-11 23:54:36

テスト駆動開発とは

テスト駆動開発 (Test Driven Development; TDD) とは、テストケースを書くことからプログラミングを始める、開発手法です。

ざっくり言うと、「このメソッドにこの引数を与えると、この値が返ってくるよね」といったことを、テストコードを用いて検証しながら、開発を進めていくスタイルと言うことができるでしょう。

TDD を知らない人がこの説明を聞くと、「TDD はコードの安全性のための手法である」と思われるかもしれません。
確かに、TDD はコードの安全性をもたらします。
しかし、TDD がもたらすものの中には、「コードの簡潔性」をも含まれます。

何故コードが簡潔になるのか

これは私見ですが、簡潔で読みやすいコードは、「入力と出力の束である」ことが多いです。
それはつまり、メソッド・関数が適切な単位で細かく文節され、それらの協調により組み立てられているコードです。

逆に読みづらい・わかりづらいコードは、「1 つのメソッド・関数が頑張り過ぎている」コードです。
1 つのメソッドが長いと、開発やデバッグの際に、「コード中のどこにバグが潜んでいるのか」を見つけ出すことが困難になります。

TDD による開発では、「テストしやすいコードを書く」ために、必然的に、コードが細分化されます。
その 1 つ 1 つに対して「このメソッドにこの引数を与えると、この値が返ってくるよね」を書いておけば、大幅なリファクタリングも、コードの同質性を検証しながら行うことができます。

TDD と私

新卒で Web エンジニアとして就職した 1 年前、私は TDD を知りませんでした。

そのうち、ブログなどで TDD について知り、Ruby の標準ライブラリ test/unit を使って、遊び程度にテストを書くようになります。

その後、東京 RubyKaigi 03 における、和田卓人氏 (@twada) のワークショップで RSpec の写経を行うことで、TDD の威力を実感することになります。

それ以来、仕事でも、PHPUnit を用いての、TDD による開発を心がけています。

プログラミングについては少しずつ勉強していますが、その中でも一番インパクトがあったのは間違いなく TDD であったと言いきることができます。
とはいえ、まだまったくの初心者レベルなので、勉強しながら、このブログで発表していこうと思います。

PHP Unit をインストール

Ubuntu 10.04 上の LAMP 環境で、PHP5 以上 (筆者は 5.3) 、そして pear がインストールされていることを前提としています。

公式ドキュメントに倣いますが、root 権限が必要となるため、sudo 付きで実行します。

sudo pear channel-discover pear.phpunit.de
sudo pear channel-discover pear.symfony-project.com

上記コマンドで PEAR チャネル (ライブラリのインストール元のサーバ) を追加し、次のコマンドで PHPUnit がインストールされます。

sudo pear install phpunit/PHPUnit

これでインストール完了です。引数無しで phpunit コマンドを実行して、バージョン情報と Usage が表示されれば成功です。
2010 年 7 月 11 日現在では、PHPUnit 3.4.14 がインストールされます。

本日はここまで。
次回は実際にテストコードを書いていく予定です。

mb_addslashes() というのを作った

2010-05-17 00:36:04

社内勉強会にて、PHP のセキュリティについてプレゼンすることになりました。その中で、addslashes() はマルチバイト文字のことを考慮していないから使用禁止 ! ということを話すのですが、代案を示さないのもよくないので、mb_addslashes() というものを作りました。

ただ、addslashes() がマルチバイトに対応したところで、SQL 文のエスケープとして適切か ? というと必ずしもそうではないので、今度は mb_mysql_real_escape_string() (長い) を作ろうと思います。

ともあれ、せっかく書いたので公開します。mbstring 必須です。

xml.parsers.expat で XML 文書を解析する

2010-05-03 03:26:04

Google App Engine (以下 GAE) 上で Amazon の Product Advertising API を扱うべく、Python の XML ライブラリについて調べていました。どうも Pythonista の間では lxml というのがメジャーらしいので、さっそく組み込んでみたのですが、どうも動かない

調べて見たところ、GAE 上では、セキュリティの関係上、C 拡張による Python ライブラリは動かないとのことで、lxml は使えないようです。

代替ライブラリを探す

C 拡張がダメということは、つまり Pure Python なライブラリなら OK、という解釈でいいのでしょうか。探してみたところ、ちょうど先日購入した の p.479 に「XML 文書を Python のオブジェクトツリーに変換」というレシピが載っていました。

写経、そして修正

さっそく写経してみたのですが、動かない。しばらく調べた結果、誤植によるものと思われるバグを発見。その他いくつかの修正を加えたものを GitHub に公開しました。

主な変更点は以下の通りです。

ただし、あくまでも習作であり、エラー処理等もかなり甘いので、実用的とは言えません。
その代わり、ちょっと遊ぶ程度にはちょうどいい手軽さかも。

コード

テストコード

__getattr__ による Element.getElements() へのショートカットについて

__getattr__ というのは、インスタンスに存在しないプロパティを呼び出そうとしたときに呼び出されるもので、PHP でいうと、マジックメソッドの __get にあたるものと言えるでしょう。

これにより、以下のようなショートカットを実現しています。意味はどちらも同じです。

終わりに

もともと GAE に組み込むことを目的として上記ライブラリを修正したわけですが、実はまだ組み込めてません・・・。ただ、expat を GAE に組み込んでいる例はネット上に転がっているので、まぁこれもいけるのではないかと。真相はまた今度。

関連リンク