Prev Next

第3章 PHPUnit のインストール

PHPUnit は、三通りのインストール方法に対応しています。PEAR インストーラ あるいは Composer で、PHPUnit とその依存コンポーネントをダウンロードしてインストールすることもできるし、 PHPUnit を PHP Archive (PHAR) 形式でダウンロードすることもできます。PHAR 版の PHPUnit は、 必要な依存コンポーネントがすべて (オプションのコンポーネントの一部も含めて) ひとつのファイルにまとめられています。

注記

Composer および PHP Archive (PHAR) には、PHPUnit 3.7 以降で対応するようになりました (安定したのは PHPUnit 3.7.5 からです)。 それより前のバージョンの PHPUnit は、これらの形式では配布されていません。

注記

PHPUnit 3.8 は PHP 5.4.7 以降のバージョンで動作しますが、PHP 5.5.0 以降を使うことを強く推奨します。

PHPUnit では PHP_CodeCoverage というライブラリを使ってコードカバレッジ情報を処理していますが、 このライブラリを使うには Xdebug 2.2.1 以降が必要です。 しかし、Xdebug 2.3.0 以降を使うことを強く推奨します。

PEAR

次のふたつのコマンドを実行するだけで (root として実行しなければならないかもしれません)、PHPUnit に必要なものがすべて PEAR インストーラを使ってインストールできます。

pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit

注意

OS のディストリビューションや PHP の環境によっては、 ここで説明する手順を実行する前に まず PEAR をインストールしたり既存の PEAR をアップデートしたりする必要があるかもしれません。

既存の PEAR 環境のアップデートは、通常は sudo pear upgrade PEAR を実行するだけのことです。PEAR の新規インストール方法は PEAR マニュアル に説明があります。

Composer

PHPUnit をプロジェクト単位で導入して開発用の依存関係を設定するには、 phpunit/phpunit への依存情報をプロジェクトの composer.json ファイルに追加します。 次に示すのは最小限の composer.json ファイルの例で、 開発時の PHPUnit 3.8 への依存を定義しています。

{
    "require-dev": {
        "phpunit/phpunit": "3.8.*"
    }
}

システム全体で使えるようにスタンドアロンでインストールするには、 次のような composer.json を用意すればどのディレクトリからでもインストールできます。

{
    "require": {
        "phpunit/phpunit": "3.8.*"
    },
    "config": {
        "bin-dir": "/usr/local/bin/"
    }
}

PHP Archive (PHAR)

PHPUnit を PHP Archive (PHAR) 形式でダウンロードすることもできます。PHAR 版の PHPUnit は、 必要な依存コンポーネントがすべて (オプションのコンポーネントの一部も含めて) ひとつのファイルにまとめられています。

wget http://pear.phpunit.de/get/phpunit.phar
chmod +x phpunit.phar

オプションのパッケージ

オプションのパッケージとして、これらが使えます。

DbUnit

DbUnit の PHP/PHPUnit 向けの移植。データベースとのやりとりをテスト可能にする。

このパッケージは、PEAR を使って次のコマンドでインストールします。

pear install phpunit/DbUnit

composer でインストールするには、 "require-dev" に次の行を追加します。

"phpunit/dbunit": ">=1.2"
PHP_Invoker

callable をタイムアウトつきで実行するユーティリティクラス。 テストのタイムアウトを厳格に指定するために必要なパッケージ。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHP_Invoker

composer でインストールするには、 "require-dev" に次の行を追加します。

"phpunit/php-invoker": "*"
PHPUnit_Selenium

PHPUnit 用の Selenium RC インテグレーション。

このパッケージは、PEAR を使って次のコマンドでインストールします。

pear install phpunit/PHPUnit_Selenium

composer でインストールするには、 "require-dev" に次の行を追加します。

"phpunit/phpunit-selenium": ">=1.2"
PHPUnit_Story

PHPUnit で振る舞い駆動開発をするための、ストーリーベースのテストランナー。

このパッケージは、PEAR を使って次のコマンドでインストールします。

pear install phpunit/PHPUnit_Story

composer でインストールするには、 "require-dev" に次の行を追加します。

"phpunit/phpunit-story": "*"
PHPUnit_SkeletonGenerator

プロダクションコードのクラスからテストクラスの雛形を生成したり、 その逆の操作をしたりするツール。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_SkeletonGenerator
PHPUnit_TestListener_DBUS

イベントを DBUS に送信するテストリスナー。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_TestListener_DBUS
PHPUnit_TestListener_XHProf

XHProf を使ってテスト対象コードの自動プロファイリングを行うテストリスナー。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_TestListener_XHProf
PHPUnit_TicketListener_Fogbugz

Fogbugz issue API 用のチケットリスナー。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_TicketListener_Fogbugz
PHPUnit_TicketListener_GitHub

GitHub issue API 用のチケットリスナー。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_TicketListener_GitHub
PHPUnit_TicketListener_GoogleCode

Google Code issue API 用のチケットリスナー。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_TicketListener_GoogleCode
PHPUnit_TicketListener_Trac

Trac issue API 用のチケットリスナー。

このパッケージは、次のコマンドでインストールします。

pear install phpunit/PHPUnit_TicketListener_Trac

アップグレード

PHPUnit 3.6 から PHPUnit 3.8 へのアップグレードの際に出くわすことになる、 過去との互換性に関するちょっとした問題をまとめます。

アップグレードそのものは極めて簡単で、特に問題も発生しません。 主要なオープンソースのフレームワークのすべてを対象にテストをして、 まったく問題がありませんでした。 しかし、プロジェクトによって事情は異なるでしょう。 これまでのリリース候補を一度も試さずにアップグレードした人は戸惑うかもしれません。 そんなときは、このドキュメントが助けとなるでしょう。

非推奨の OutputTestCase が削除された

PHPUnit_Extensions_OutputTestCase クラスは削除されました。 PHPUnit 3.6 のときには非推奨の notice を発行していたものです。 出力をテストする方法については 「出力内容のテスト」 をご覧ください。

テストケースを実行するたびに、現在の作業ディレクトリに戻るようになった

テストの中で作業ディレクトリ (cwd) を変更すると、 これまでの PHPUnit はコードカバレッジの出力で問題が発生していました。 3.8 ではテストケースごとに作業ディレクトリを復元するようになったので、 他のテストケースで作業ディレクトリを変更していることを前提としたテストケースで 問題が発生します。もともとそんな状況は好ましくないし、 簡単に修正できるでしょう。

テストリスナーが autoload を呼ぶようになった

「テストリスナー」 で説明しているカスタムテストリスナーを使うとき、 これまでの PHPUnit ではテストリスナーを読み込めなくてもエラーになりませんでした。 そのため、テストリスナーが読み込めないことが原因で問題が発生しても、 原因を追及しにくかったのです。3.8 からは autoload でクラスを探すようになりました。 テストリスナーが見つからないときは autoload でエラーになります。 autoloader がテストリスナーを見つけられないと問題になるので、 そのリスナーを削除するなり bootstrap.php できちんと読み込むようにするなりして解決しましょう。

モックオブジェクトへのパラメータは、クローンされなくなった

これまでは、モックを使うときにはすべてのオブジェクトのパラメータをクローンしていました。 そのため、メソッドに渡されたオブジェクトの同一性を確かめたいときや そもそもクローンできないオブジェクトであった場合などに問題が発生していました。 多くの人からいただいた要望に応えて、この振る舞いは変わりました。 例 10.13 に、新しい実装がいかに便利かを示す例があります。 例 10.14 で、過去のバージョンの挙動に戻す方法を説明しています。

addUncoveredFilesFromWhitelist が削除され、 processUncoveredFilesFromWhitelist に変わった

コードカバレッジの生成で <whitelist addUncoveredFilesFromWhitelist="true"> を使うとき、カバーされないすべてのファイルは PHPUnit に含まれませんでした。 これらのファイルに実行可能なコードを配置している人にとっては、これは問題でした。 PHPUnit 3.8 からは、ファイルをスキャンしてどのコードが実行可能かを調べ、 どのコードを除外してはいけないかを調べるようになりました。 その結果、コードカバレッジの結果が変わることになるかもしれません。

過去のバージョンと同じ挙動にするには、 <whitelist processUncoveredFilesFromWhitelist=="true"> と設定します。PHPUnit 3.6 での挙動と 3.8 での挙動のどちらを使いたい人もいるので、 しばらくはどちらの挙動でも使えるようにしておきます。

cacheTokens のデフォルト値が false に変わった

PHPUnit 3.8.2 からは、トークン化したファイルを デフォルトではキャッシュしないようにしました。 大規模なプロジェクトのコードカバレッジレポートを作るときに、 キャッシュは大量のメモリを消費します。 また、ホワイトリストの仕様変更の影響もあって、 何千ものクラスを含むコードベースではキャッシュが問題になっていました。

もし比較的小規模なプロジェクトであったり十分にメモリを確保できたりする場合は、 phpunit.xmlcacheTokens="true" を追加してください。 詳しくは 「PHPUnit」 をご覧ください。

Prev Next
1. 自動テスト
2. PHPUnit の目標
3. PHPUnit のインストール
PEAR
Composer
PHP Archive (PHAR)
オプションのパッケージ
アップグレード
4. PHPUnit 用のテストの書き方
テストの依存性
データプロバイダ
例外のテスト
PHP のエラーのテスト
出力内容のテスト
アサーション
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
assertContainsOnly()
assertContainsOnlyInstancesOf()
assertCount()
assertEmpty()
assertEqualXMLStructure()
assertEquals()
assertFalse()
assertFileEquals()
assertFileExists()
assertGreaterThan()
assertGreaterThanOrEqual()
assertInstanceOf()
assertInternalType()
assertJsonFileEqualsJsonFile()
assertJsonStringEqualsJsonFile()
assertJsonStringEqualsJsonString()
assertLessThan()
assertLessThanOrEqual()
assertNull()
assertObjectHasAttribute()
assertRegExp()
assertStringMatchesFormat()
assertStringMatchesFormatFile()
assertSame()
assertSelectCount()
assertSelectEquals()
assertSelectRegExp()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()
assertTag()
assertThat()
assertTrue()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
5. コマンドラインのテストランナー
Command-Line switches
6. フィクスチャ
tearDown() よりも setUp()
バリエーション
フィクスチャの共有
グローバルな状態
7. テストの構成
ファイルシステムを用いたテストスイートの構成
XML 設定ファイルを用いたテストスイートの構成
8. データベースのテスト
データベースのテストに対応しているベンダー
データベースのテストの難しさ
データベーステストの四段階
1. データベースのクリーンアップ
2. フィクスチャの準備
3–5. テストの実行、結果の検証、そして後始末
PHPUnit のデータベーステストケースの設定
getConnection() の実装
getDataSet() の実装
データベーススキーマ (DDL) とは?
ヒント: 自前でのデータベーステストケースの抽象化
データセットとデータテーブルについて知る
利用できる実装
外部キーには注意
自作のデータセットやデータテーブルの実装
接続 API
データベースアサーション API
テーブルの行数のアサーション
テーブルの状態のアサーション
クエリの結果のアサーション
複数のテーブルの状態のアサーション
よくある質問
PHPUnit は、テストごとにデータベーススキーマを作り直すの?
PDO を使ったアプリケーションじゃないと Database Extension を使えないの?
Too much Connections というエラーが出たらどうすればいい?
フラット XML や CSV のデータセットで NULL を扱う方法は?
9. 不完全なテスト・テストの省略
不完全なテスト
テストの省略
@requires によるテストのスキップ
10. テストダブル
スタブ
モックオブジェクト
トレイトと抽象クラスのモック
ウェブサービスのスタブおよびモック
ファイルシステムのモック
11. テストの進め方
開発中のテスト
デバッグ中のテスト
12. テスト駆動開発
銀行口座の例
13. 振舞駆動開発
ボウリングゲームの例
14. コードカバレッジ解析
カバーするメソッドの指定
コードブロックの無視
ファイルのインクルードや除外
エッジケース
15. テストのその他の使用法
アジャイルな文書作成
複数チームでのテスト
16. 雛形ジェネレータ
テストケースクラスの雛形の作成
テストケースクラスからのクラスの雛形の作成
17. PHPUnit と Selenium
Selenium Server
インストール
PHPUnit_Extensions_Selenium2TestCase
PHPUnit_Extensions_SeleniumTestCase
18. ログ出力
テスト結果 (XML)
テスト結果 (TAP)
テスト結果 (JSON)
コードカバレッジ (XML)
コードカバレッジ (テキスト)
19. PHPUnit の拡張
PHPUnit_Framework_TestCase のサブクラスの作成
カスタムアサーションの作成
PHPUnit_Framework_TestListener の実装
PHPUnit_Extensions_TestDecorator のサブクラスの作成
PHPUnit_Framework_Test の実装
A. アサーション
B. アノテーション
@author
@after
@afterClass
@backupGlobals
@backupStaticAttributes
@before
@beforeClass
@codeCoverageIgnore*
@covers
@coversNothing
@dataProvider
@depends
@expectedException
@expectedExceptionCode
@expectedExceptionMessage
@group
@outputBuffering
@preserveGlobalState
@requires
@runTestsInSeparateProcesses
@runInSeparateProcess
@test
@testdox
@ticket
C. XML 設定ファイル
PHPUnit
テストスイート
グループ
コードカバレッジ対象のファイルの追加や除外
ログ出力
テストリスナー
PHP INI 項目や定数、グローバル変数の設定
Selenium RC の設定ブラウザ
D. 目次
E. 参考文献
F. 著作権