composerでPHPUnitをインストールしてどんなにマクロなプログラムを書いた時もテストする

# マクロなプログラムを書いたときでもテストを書く

「プロジェクトごとに[PHPUnit](https://packagist.org/packages/phpunit/phpunit)をインストールするのはめんどくさいがテストは書いておきたい～」
ということで[composer](https://getcomposer.org/)のglobalに[PHPUnit](https://packagist.org/packages/phpunit/phpunit)をインストールしてそれを使うようにしていきます。
（※基本Windowsユーザー向けで書いてます）

# composerのglobalにPHPUnitをインストール

[composer](https://getcomposer.org/)がインストールされている想定で書いていきます。
まず、composerのglobalがあるとこに移動

```
$ cd  C:/Users/User/AppData/Roaming/Composer
```

このディレクトリに**composer.json**ファイルを作成します。

ここではPHPUnitの安定板の6.5系をインストールすることにします。(※バージョンによりPHPの互換性が異なるので注意)
**composer.json**ファイルを作成し以下のように記述（`composer init`でも生成可）

```composer.json
{
    "require-dev": {
        "phpunit/phpunit": "6.5.*"
    }
}
```

**composer.json**ファイルを作成したら`composer install`でインストール

```
User@**** MINGW64 ~/AppData/Roaming/Composer
$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 28 installs, 0 updates, 0 removals
  - Installing sebastian/version (2.0.1): Loading from cache
  - Installing sebastian/resource-operations (1.0.0): Loading from cache
  - Installing sebastian/recursion-context (3.0.0): Loading from cache
  - Installing sebastian/object-reflector (1.1.1): Loading from cache
  - Installing sebastian/object-enumerator (3.0.3): Loading from cache
  - Installing sebastian/global-state (2.0.0): Loading from cache
  - Installing sebastian/exporter (3.1.0): Loading from cache
  - Installing sebastian/environment (3.1.0): Loading from cache
  - Installing sebastian/diff (2.0.1): Loading from cache
  - Installing sebastian/comparator (2.1.3): Loading from cache
  - Installing doctrine/instantiator (1.1.0): Loading from cache
  - Installing phpunit/php-text-template (1.2.1): Loading from cache
  - Installing phpunit/phpunit-mock-objects (5.0.6): Loading from cache
  - Installing phpunit/php-timer (1.0.9): Loading from cache
  - Installing phpunit/php-file-iterator (1.4.5): Loading from cache
  - Installing theseer/tokenizer (1.1.0): Loading from cache
  - Installing sebastian/code-unit-reverse-lookup (1.0.1): Loading from cache
  - Installing phpunit/php-token-stream (2.0.2): Loading from cache
  - Installing phpunit/php-code-coverage (5.3.0): Loading from cache
  - Installing webmozart/assert (1.3.0): Loading from cache
  - Installing phpdocumentor/reflection-common (1.0.1): Loading from cache
  - Installing phpdocumentor/type-resolver (0.4.0): Loading from cache
  - Installing phpdocumentor/reflection-docblock (4.3.0): Loading from cache
  - Installing phpspec/prophecy (1.7.5): Loading from cache
  - Installing phar-io/version (1.0.1): Loading from cache
  - Installing phar-io/manifest (1.0.1): Loading from cache
  - Installing myclabs/deep-copy (1.7.0): Loading from cache
  - Installing phpunit/phpunit (6.5.7): Loading from cache
sebastian/global-state suggests installing ext-uopz (*)
phpunit/phpunit-mock-objects suggests installing ext-soap (*)
phpunit/php-code-coverage suggests installing ext-xdebug (^2.5.5)
phpunit/phpunit suggests installing phpunit/php-invoker (^1.1)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files

User@**** MINGW64 ~/AppData/Roaming/Composer
```

インストールが終わったらPHPUnitのversionが指定したversionなのかを確認しておく

```
User@**** MINGW64 ~
$ phpunit --version
PHPUnit 6.5.7 by Sebastian Bergmann and contributors.


User@**** MINGW64 ~
```

（もしかして：[PHPUnitのバージョンがおかしい](https://qiita.com/sola-msr/items/5e5131d1a0f80b6f1303#%E3%81%8A%E3%81%BE%E3%81%91phpunit%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%84)）

# テストを書く

PHPUnitのインストール完了後、対象のプロジェクトディレクトリに移動してテストを書いていきます。
ドキュメントルートにtestsディレクトリを作成し、その中に **`テスト対象クラス+Test`** という名前でテストファイルを作成。
（この際、テスト対象のファイルを読み込む必要があります。）

↓テストを書いた例

```HogeTest.php
<?php
use PHPUnit\Framework\TestCase;

// テスト対象のファイルを読み込む
require('../../programDir/Hoge.php');

class HogeTest extends TestCase
{
    /**
     * Hoge Object
     *
     * @var Object
     */
    protected $hoge;

    /**
     * 各テストメソッドが実行される前に、setUp() という名前のテンプレートメソッドが実行される。
     * （テスト対象のオブジェクトを生成するような処理に使用する。）
     */
    protected function setUp() {
        $this->hoge = new Hoge();
    }

    public function test_TrueはTrueであること()
    {
        $this->assertTrue(True);
    }

    public function test_値がhogehogeの場合ほげほげが返ること()
    {
        // HogeクラスにhogeMethodがある想定のテスト例
        $this->assertEquals('ほげほげ', $this->hoge->hogeMethod('hogehoge'));
    }

}
```

`setUp()`メソッドのほかにも`tearDown()`メソッドやらいろいろあります。詳しくは[PHPUnitのマニュアル](https://phpunit.de/manual/current/ja/fixtures.html#fixtures.more-setup-than-teardown)を見てください。


テストを書き終わったら、テストファイルのあるディレクトリに移動して

`phpunit ****Test.php`

を実行。（phpunitにパスが通ってるか要確認）

↓実行例

```
$ phpunit HogeTest.php
PHPUnit 6.5.7 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 167 ms, Memory: 4.00MB

OK (2 tests, 2 assertions)
```

これでどんなにマクロなプログラムを書いたときでもテストをかける生活ができます（？）



# おまけ：PHPUnitのバージョンがおかしい

6.5系をインストールしたはずなのになぜか`PHPUnit 3.7.**`とか表示されている。。。

ってなった人はもしかして**XAMPPをインストールしてる人**ですかね。
Windowsの環境変数に**`C:\xampp\php`**が書いてあると、XAMPPの方の古いPHPUnitを見に行ってしまう（っぽい）。
なので、（都合が悪くない場合のみ）このパスを消せばcomposerでglobalにインストールした方のPHPUnitを見に行くようになります。
（※ただし環境によりけり）

他に調べてみると↑とは異なる解決方法が書かれてあったので参考にするといいかも（ちなみに自分はこれできませんでした）

- [php - PHPUnit - Version 3.7.21 instead of Version 6 installed - Stack Overflow](https://stackoverflow.com/questions/42696087/phpunit-version-3-7-21-instead-of-version-6-installed)

ついでにコマンドプロンプトからパスの確認するコマンドも書いておきます
つ `echo %path:;= / %`


# おわり
- おまけ～とか書いてるけどぶっちゃけめっちゃ詰まったとこです
- 本当はプロジェクトごとにインストールしたかったんですが、わからなかったが本音のところがある
- なんか間違えてるところとかいい方法があれば教えていただきたく

# 参考

- [PHPUnit マニュアル](https://phpunit.de/manual/6.5/ja/index.html)
- [PHPUnit マニュアル – 第4章 フィクスチャ](https://phpunit.de/manual/current/ja/fixtures.html#fixtures.more-setup-than-teardown)
- [PHP依存管理ツールComposerのコマンドまとめ - AIDEN-STYLE](http://aiden-style.com/article/php-composer-commands/)
- [phpunit/phpunit - Packagist](https://packagist.org/packages/phpunit/phpunit)
- [Composerのインストールと使用方法 | WEBサービス創造記](http://linuxserver.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/php/composer)

以下は個人的なURLメモ

- [XAMPP環境でphpunitをインストールしてユニットテストを実行する – Monaural Sound](https://ka2.org/how-to-install-phpunit-in-xampp-for-windows/)
- [phar.phpunit.de](https://phar.phpunit.de/)
- [How to set composer global bin path in Windows — photogabble.](https://www.photogabble.co.uk/blog/tools-and-resources/how-to-set-composer-bin-path-in-windows/)