ComposerでPHPUnit一式+Mockeryをインストール


**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 を作る

```json:composer.json
{
	"require-dev": {
		"phpunit/phpunit": "3.7.*",
		"mockery/mockery": "0.7.*"
	}
}
```

phpunitの本家はなかなかcomposerに対応していませんでした。なので、今までは本家のリポジトリではなく、[EHER/phpunit-all-in-one](https://github.com/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: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:phpunit.bootstrap.php
<?php

// For composer
require_once 'vendor/autoload.php';

// テストクラス対象のオートロードなどもここに書く
```

# 単体テストのサンプルを作って試してみる

```
$ mkdir MyProject
$ cd MyProject/
$ vim ExampleTest.php
```

```php: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` に生成されます。


以上。