PHPUnit3で始めるユニットテスト

第1回 PHPUnit入門

この記事を読むのに必要な時間:およそ 1 分

はじめに

皆さん,テストしてますか?

近年,システム開発を発注する顧客や利用ユーザーの品質に対する要求レベルは格段に向上しています。そのため,システムの品質を保証するための「テストフェーズ」はますます欠かせなくなってきています。

ここで,一口に「テスト」といっても,フェーズによって以下のような様々なテストがあります。

  • ユニットテスト・単体テスト
  • 結合テスト・システムテスト
  • 総合テスト
  • 受け入れテスト
  • 負荷テスト
  • セキュリティテスト

筆者の経験上,一般的なシステム開発でもっとも大きな工数を占めるのは,この「テスト」フェーズと考えています。なぜなら,テストフェーズは例外なく「繰り返し作業」だからです。前述の様々なテストフェーズで共通することですが,テストフェーズは「テストで発見されたバグ・障害を修正して再度テストを行う」という作業を何度も繰り返し行うフェーズです。あとのフェーズで不具合が発見された場合,当然プログラムを修正することになりますが,それに伴ってそれより前のフェーズのテストも再度行う必要が発生します。つまり,発見されるバグ・障害の数やフェーズに従って,作業量(=工数)が指数関数的に増加する,ということを意味しています。このため,製造フェーズの早い段階で問題点をあぶり出しておくことが重要になってきます。

また,システムの「開発」よりも「保守」の方がずっと長期かつ重要であることを開発者は忘れがちです。システム開発を発注する顧客にとっては,「システムが完成したら終わり」ではありません。やっとスタートラインに立っただけなのです。その保守フェーズでは,システムの改修や拡張,仕様追加・変更などが発生します。そのたびにプログラムを修正しテストを行う必要がありますが,機能のデグレードや思わぬ不具合が発生する可能性があります。このように,システムの品質を「保証」し続ける事は,非常に重要なことです。

さらに,開発者としては「間違いなくこれで問題ありません」と自信を持ってリリースできれば精神的にも良いのですが,「これは本当にリリースしても大丈夫なのか?」「他に影響ないだろうな?」といった不安を抱えたままリリース作業に突入してしまい・あとは言わずもがなですね。

近年では,XP(eXtreme Programming)やTDD(Test Driven Development)といった反復型の開発手法がだいぶ一般的になってきていますが,それらの手法の重要な要素の1つに「テストの自動化」が挙げられています。それらが採用される理由は多々ありますが,システムの品質を保ちつつ,開発や改修・拡張を行っていける手法であることが大きな要因ではないかと思います。

テストを自動化することで,人手をかけずいつでも自動的にテストできるようになります。また,コードのデグレードや問題点などを事前に検知することもできます。結果,コードの品質を一定に保つことが可能になります。また,開発者の不安を取り除く,精神的にも大きな助けとなります。つまり,自信を持って改修,リリースできるようになるということです。これは直接的な効果ではありませんが,開発者に非常に大きな影響を与えます。また,「テスト」という必須と分かっているけれども開発者にとって(どちらかというと)ネガティブな作業を,「コーディング」という開発者にとってポジティブな作業に変える側面も持っていると考えています。

さて,XPやTDDで行う「テストの自動化」は,xUnitと呼ばれるテスティングフレームワークを利用しています。これらxUnitは名前の通り,ユニットテストをターゲットとしたテスティングフレームワークです。実際にxUnitというものが存在するわけではなく,「x」の部分にJavaの場合は「J」,VBの場合は「VB」,C++の場合は「Cpp」という具合に言語名の略称が入り,それらの総称として「xUnit」が使われます。PHPの場合,今回見ていく「PHPUnit」があります。

PHPUnitとは

すでによく知っている・実際に使っている方も多いと思いますが,改めてPHPUnitをご紹介します。PHPUnitとは,Sebastian Bergmann氏が開発を行っているテスティングフレームワークの1つです。

2007年8月15日現在,バージョン3.1.7がリリースされており,PHP5.1.4以降で利用可能です。PHPUnitのpear.php.net/package/PHPUnit">バージョン1バージョン2PEARサイトで管理されていますが,すでにメンテナンスは終了しています。また,バージョン3以降,Sebastian氏のサイトで管理されるようになっています。なお,バージョン2.3.0β1からPHP5専用となっています。

最新系列のPHPUnit3.1は非常に多機能です。以下,主な機能を上げておきます。

  • コマンドラインのテストランナー
  • TestSuiteのサポート
  • 拡張TestCase
  • モックオブジェクトのサポート
  • コードカバレッジ解析(Xdebugが必須)
  • 様々なフォーマットでのログ出力(XML,JSON,Test Anything Protocol (TAP),GraphViz)
  • テストコードの雛形ジェネレータ

本連載では,PHPUnit3の基本的な使い方やプロジェクトで役立つ機能について解説していきます。

使用する環境

本連載の動作確認に使用した環境は,CentOS4.5+Apache2.2.4+PHP5.2.3+PHPUnit3.1.7です。PHPは以下のようなconfigureオプションを付けてソースからbuildしています。

--with-apxs2=/usr/local/apache2/bin/apxs \
--prefix=/usr/local/lib/php5 \
--with-pear=/usr/local/lib/php5/pear \
--with-config-file-path=/usr/local/lib/php5/ini/5.2.3 \
--with-config-file-scan-dir=/usr/local/lib/php5/ini.d \
--enable-zend-multibyte \
--enable-mbstring=shared \
--with-dom \
--enable-filter=shared \
--with-gettext=shared \
--with-mcrypt=shared \
--with-gd=shared \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-ttf \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-soap=shared \
--enable-pdo=shared \
--with-pdo-sqlite=shared \
--with-sqlite=shared \
--enable-sqlite-utf8 \
--with-openssl=shared \
--with-curl=shared \
--enable-bcmath=shared \
--enable-pcntl=shared \
--enable-sockets=shared \
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo=shared \
--enable-sigchild \
--with-xsl=shared \
--enable-zip=shared

「--prefix」オプションを付けているため,phpコマンドやpearコマンド,その他コマンドのパスがデフォルトとは変わっていますので,適宜読み替えてください。また,便宜上,作業ユーザーでPEARライブラリなどをインストールできるよう,sudoerファイルを編集してあります。

著者プロフィール

下岡秀幸(しもおかひでゆき)

PHP関連の情報サイト「Do You PHP?」の管理人。PHP歴は長いが,あまり仕事で使ったことがないという噂がある。最近はα版のPEAR・PECLに手を出しては地雷を踏んでいることが多い。

URLhttp://www.doyouphp.jp/http://d.hatena.ne.jp/shimooka/

コメント

  • 誤植?

    >ここでは2つのテストメソッド

    > * testNewArrayIsEmpty
    > * testArrayContainsAnElement

    >が用意されていますが,

    arrayContainsAnElementTest()
    では?

    Commented : #1  kamo (2009/06/28, 13:23)

コメントの記入