アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 特集 » PHPUnit3で始めるユニットテスト » 第1回 PHPUnit入門

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

第1回 PHPUnit入門

はじめに

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

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

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

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

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

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

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

近年では,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のバージョン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/

トラックバック

  • [PHP]ZendFrameworkで作成したControllerをPHPUnitでテストする

    PHPUnitは基本的にはコマンドラインから実行するツールで、ZendFrameworkで作成されたControllerはWebサーバ経由で実行されるものなので、簡単にはテストができない。
    Controllerのテストが単体テスト(Unit Test)と呼べるものかどうかという点については、ここでは議論しな...

    Tracked : #1  ブログが続かないわけ (2008/05/14, 18:57)

コメント

  • 誤植?

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

    > * testNewArrayIsEmpty
    > * testArrayContainsAnElement

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

    arrayContainsAnElementTest()
    では?

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

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

読むウェブ ~本とインタラクション

ディスプレイで読む活字とそのインタラクション(interaction:相互作用)について,最新Webを紹介しながら読み解いていく。

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

ここは知っておくべき!Windows Server 2008技術TIPS

5年ぶりのサーバOSとなったWindows Server 2008が出荷されて早2年。2009年にはR2が出荷され,再び注目を集めています。発売前から実施したトレーニングによって感じた,インフラエンジニアの方々に知っておいていただきたい機能を中心にご紹介します。

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス