PHPUnit の各バージョンについて調べてみた

## 概要

PHPUnit がバージョン上がって追加された新機能、使いこなしてないことが多いように思えましたので、各バージョンで何が増え、何が変わったのか、リリースノートから抽出して、特に美味しそうな項目をまとめて、簡単に解説してみます（多いので勝手ながら、使えそうなものを選んでます）。

# [PHPUnit 4.0.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.0.0)

### 新機能

- [テストプロキシ](https://github.com/sebastianbergmann/phpunit-mock-objects/issues/132) : 元のクラスのメソッドを模倣（そのまま呼ぶ？）してくれるモック。
- [`willReturn*()`](https://github.com/sebastianbergmann/phpunit-mock-objects/pull/147) : `will($this->returnValue($value))` が `willReturn($value)` と書けるように。他にも `willReturn` シリーズが各種用意されている。

### 下位互換の問題

- static のモック/スタブのサポートが限定的に。今後は、同じクラスの別メソッドから呼ばれるときしか機能しない。


# [PHPUnit 4.1.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.1.0) 

### 新機能

- マッチャ [withConsecutive()](https://github.com/sebastianbergmann/phpunit-mock-objects/commit/8f0d753689a21f93be559c135439e8da2cbd42e4) : 呼ばれるごとに期待する引数が異なる場合にまとめて指定できる。これは便利。下記のように書ける:

```php:
$mock = $this->getMock('stdClass', array('foo'));
$mock
    ->expects($this->any())
    ->method('foo')
    ->withConsecutive(
        ['bar'], //１回目の呼び出し : $mock->foo('bar')
        [21, 42] //２回目の呼び出し : $mock->foo(21, 42)
    );
```

※ 上記は [Framework_MockObject_Matcher_ConsecutiveParametersTest](https://github.com/sebastianbergmann/phpunit-mock-objects/blob/8f0d753689a21f93be559c135439e8da2cbd42e4/tests/MockObject/Matcher/ConsecutiveParametersTest.php) より引用。



# [PHPUnit 4.2.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.2.0) 

### 新機能

- `atLeast()` と `atMost()` 追加 : 前までは `atLeastOne()` （少なくとも１回は呼ばれること）ならあったが、回数の明示や、「多くとも」の指定はできなかった。
- `assertTag()` と `assertSelect*()` が非推奨に: 今後は [phpunit-dom-assertions](https://github.com/phpunit/phpunit-dom-assertions) を使えということらしい。



# [PHPUnit 4.3.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.3.0) 

### 新機能

- `@expectedExceptionMessageRegExp` 追加 : 正規表現で例外のメッセージ指定できるようになる。


# [PHPUnit 4.4.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.4.0) 

### 新機能

- `assertArraySubset()` 追加 : 配列を含むかをアサーションする。(参考: [マニュアル](https://phpunit.de/manual/current/ja/appendixes.assertions.html#appendixes.assertions.assertArraySubset))



# [PHPUnit 4.5.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.5.0) 

### 新機能

- [Prophecy](https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.prophecy) サポート : テストがより見やすく書けるかも。



# [PHPUnit 4.6.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.6.0) 

特に面白いものは無し。


# [PHPUnit 4.7.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.7.0) 

### 新機能

- HTMLのコードカバレッジレポートで large tests(薄緑)、medium tests(普通の緑)、small tests(濃い緑) に色別されるようになった。

### 下位互換の問題

- `@small`, `@medium`, `@large` を記載していないテストはすべて `@small` 扱いになる。


# [PHPUnit 4.8.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-4.8.0) 

### 新機能

- `@testWith` 追加 : `@dataProvider` のデータをコメント上に書ける。便利そう。

```php:例
/**
 * @testWith [0, 0, 0]
 *           [0, 1, 1]
 *           [1, 2, 3]
 *           [20, 22, 42]
 */
public function testAdd($a, $b, $c)
```
([単体テスト](https://github.com/sebastianbergmann/phpunit/blob/c970b9ed01302c7ed5ef14bf5cb2936415ad42f5/tests/_files/TestWithTest.php)より抜粋)

### 下位互換の問題

- `assertContains()` と `assertNotContains()` のチェックがより厳密に。
- デフォルトのグループ名が `__nogroup__` から `default` に変更。



# [PHPUnit 5.0.0](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-5.0.0) 

### 新機能

- `@depends` でディープクローンできるように。
- `@depends` で渡されたモックオブジェクトの期待チェックが、依存先でも評価されるように。

### 下位互換の問題

- コードカバレッジ解析のためのホワイトリストの設定が必須になる。

### サポート対象

- PHP 5.3, 5.4, 5.5 はサポート対象外となり、PHP 7 がサポート対象となる！ （つまり PHP 5.6 と 7 が対象。）


こんな感じで！。