UPDATE 2013/03/01: phpunitの本家がcomposerをサポートしているので、EHER/phpunit-all-in-oneを使わないようにした
このtutorialで作るファイル
.
├── MyProject
│ └── ExampleTest.php
├── composer.json
├── phpunit.bootstrap.php
├── phpunit.xml.dist
└── vendor
composer.json を作る
{
"require-dev": {
"phpunit/phpunit": "3.7.*",
"mockery/mockery": "0.7.*"
}
}
phpunitの本家はなかなかcomposerに対応していませんでした。なので、今までは本家のリポジトリではなく、EHER/phpunit-all-in-oneからphpunitをインストールするのが最も手軽でした。しかし、2012年8月13日に本家がcomposerをサポートしため、本家のリポジトリからインストールすることができます。
composer.json
の "require-dev"
は開発系の依存パッケージを指定するためのものです。一方、ここにはありませんが、通常の "require"
はプロダクトの依存パッケージを指定するのものです。この2つを区別することで、開発環境やビルドマシンではComposerでPHPUnitをインストールでき、プロダクション環境ではPHPUnitをインストールしないように環境に応じて選択することができます。
ComposerでPHPUnitなどをインストールする
"require-dev"
に指定した依存パッケージを含めてインストールする場合は --dev
をつけます。
$ composer.phar install --dev
Loading composer repositories with package information
Installing dependencies
Nothing to install or update
Loading composer repositories with package information
Installing dev dependencies
- Installing mockery/mockery (0.7.2)
Loading from cache
- Installing symfony/yaml (v2.1.8)
Loading from cache
- Installing phpunit/php-text-template (1.1.4)
Loading from cache
- Installing phpunit/phpunit-mock-objects (1.2.3)
Loading from cache
- Installing phpunit/php-timer (1.0.4)
Loading from cache
- Installing phpunit/php-token-stream (1.1.5)
Loading from cache
- Installing phpunit/php-file-iterator (1.3.3)
Loading from cache
- Installing phpunit/php-code-coverage (1.2.9)
Loading from cache
- Installing phpunit/phpunit (3.7.14)
Loading from cache
mockery/mockery suggests installing Hamcrest (1.0.0)
phpunit/phpunit suggests installing phpunit/php-invoker (>=1.1.0,<1.2.0)
Writing lock file
Generating autoload files
PHPUnitが実行できるか確認する
インストールすると、実行ファイル phpunit
がついてきます。実行ファイルは vendor/bin
に入ります。
$ ./vendor/bin/phpunit --version
PHPUnit 3.7.14 by Sebastian Bergmann.
PHPUnit設定ファイルを作る
$ vim phpunit.xml.dist
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
bootstrap="phpunit.bootstrap.php"
processIsolation="false"
verbose="true"
strict="false"
colors="true">
<testsuites>
<testsuite name="PHPUnit">
<!-- テストケースがあるディレクトリを列挙する -->
<directory>MyProject</directory>
<!-- <directory>MyProject2</directory> -->
<!-- <directory>MyProject3</directory> -->
<!-- <directory>MyProject4</directory> -->
</testsuite>
</testsuites>
<logging>
<!-- コードカバレッジ率 -->
<log
type="coverage-html"
target="metrics/coverage"
charset="UTF-8"
yui="true"
highlight="false"
lowUpperBound="35"
highLowerBound="70" />
<!-- <log type="coverage-text" target="php://stdout" lowUpperBound="35" highLowerBound="70" /> -->
<!-- 上行をアンコメントアウトするとカバレッジ率がプロンプトにも表示される -->
</logging>
<filter>
<!-- コードカバレッジ率を計測する対象の指定 -->
<whitelist>
<directory suffix=".php">src</directory>
<!-- <file>/path/to/file</file> -->
<exclude>
<file>public/index.php</file>
</exclude>
</whitelist>
<!-- コードカバレッジ測定対象から除外 -->
<blacklist>
<directory suffix=".php" group="PHPUNIT">vendor</directory>
</blacklist>
</filter>
<listeners>
<!-- mockery統合のため必要 -->
<listener class="\Mockery\Adapter\Phpunit\TestListener" file="Vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php" />
</listeners>
</phpunit>
phpunit.bootstrap.php を作成する
$ vim phpunit.bootstrap.php
<?php
// For composer
require_once 'vendor/autoload.php';
// テストクラス対象のオートロードなどもここに書く
単体テストのサンプルを作って試してみる
$ mkdir MyProject
$ cd MyProject/
$ vim ExampleTest.php
<?php
class ExampleTest extends PHPUnit_Framework_TestCase
{
public function testSomething()
{
$this->assertTrue(true);
}
}
$ cd ../
$ ./vendor/bin/phpunit
PHPUnit 3.7.14 by Sebastian Bergmann.
Configuration read from /private/tmp/phpunit/phpunit.xml.dist
.
Time: 0 seconds, Memory: 4.75Mb
OK (1 test, 1 assertion)
Generating code coverage report in HTML format ... done
PHPに xdebug
拡張が入っていればコードカバレッジは metrics/coverage/index.html
に生成されます。
以上。