Symfony と PHPStorm での PHPUnit テスト設定

[Symfony Advent Calendar 2019](https://qiita.com/advent-calendar/2019/symfony) の 10日目の記事です。昨日は、昨日は [@77web@github](https://qiita.com/77web@github) さんの [Symfony4で特定のディレクトリ以下のコントローラにだけURLのprefixをつける方法](https://tech.quartetcom.co.jp/2019/12/09/symfony4-route-prefix-by-directory/) でした！

今回が初めての Symfony Advent Calendar 参加になります。よろしくお願い致します。

----
僕は [PHPStorm](https://www.jetbrains.com/ja-jp/phpstorm/) を使って開発をしています。

大変便利な IDE で、こと PHP を触っている分には、VSCode などの他のエディタや IDE では生きていけません。
統合開発環境は、適切に設定する非常に便利で強力ですが、この「適切に設定する」というのが意外とハードルが高かったりします。今回は、PHPStrom で Symfony の開発環境を構築するにあたり、PHPUnit でのテストができるように設定する方法を解説します。

### PHPUnit Bridge component

公式ドキュメント: [Testing](https://symfony.com/doc/current/testing.html)

PHPUnit テストを Symfony 環境に統合するには、PHPUnit Bridge component をまずインストールします。
**PHPUnit 自体を、Composer で require する必要はありません。**

```
composer require --dev symfony/phpunit-bridge
```

インストールが完了するとつぎのように表示されます。

```
 How to test?


  * Write test cases in the tests/ folder
  * Run php bin/phpunit
```

このメッセージどおりに、プロジェクトのルートに `tests` ディレクトリを作って、

```
bin/phpunit
```

を実行すると、PHPUnit が自動的にインストールされて、テストが実行されます。

たまに、このコマンドを実行すると、`command not found` になることがあります。
作成済みのプロジェクトを Git リポジトリから clone して、`composer install` をしたような場合に、その症状がでるようです。そんな時には、PHPUnit Bridge component を一旦削除して、再度インストールします。

```
composer remove symfony/phpunit-bridge
```

その後

```
composer require --dev symfony/phpunit-bridge
```

これで、`bin` ディレクトリに `phpunit` ができているはずです。
正常にインストールされたら、`bin/phpunit` を実行します。

### 設定ファイル

プロジェクトのルートに `phpunit.xml.dist` というファイルがあると思います。
これを、同じ場所に `phpunit.xml` という名前でコピーしておきます。設定を変更したい場合に、こちらのファイルを変更します。

以上で、PHPUnit を使う準備ができました。コマンドラインから `bin/cphpunit` と実行すればいつでもテストが走ります。

### PHPStorm の設定

次に PHPStorm 上でテストができるように設定します。Mac で説明していますが、Windows や Linux でもほぼ同じように設定できるはずです。

#### まず、PHP のランタイムを設定しましょう。

Preference を開いて、*Languages & Frameworks > PHP* を選択します。

![PHP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/d0ecc4ea-f5e5-b3d6-b2c6-22e30f324375.png)

*PHP language level* はプロジェクトで使う PHP のバージョンに合わせます。
*CLI Interpreter* の項目では、PHP の実行バイナリの種類を指定します。初めて登録するときや登録済みのとは別の PHP を登録する時には、右端の [...] ボタンをクリックします。


![Interpreters](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/6030ac69-d355-4228-db35-526be9070819.png)

この画面で、PHP の実行バイナリの場所を指定します。僕の場合は phpbrew を使っているので、このようなパスになっています。左側にいくつかのバージョンがならんでいますが、これは phpbrew のそれぞれのバージョンを示しているものです。新しいPHPを追加する時は、左上の [+] ボタンをクリックします。Docker や Vagrant によるリモートPHPの設定も可能です。

#### いよいよ PHPUnit の設定です。

Preference の *Languages & Frameworks > PHP > Test Frameworks* を選択します。

![Test Frameworks](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/c0fc4d45-9ff8-51c4-39aa-1addf29d0136.png)


初めての時には、左側のリストには *Nothing to show* と表示されていると思います。そこで左上の [+] ボタンをクリックします。

![Choose](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/367617c8-5389-c8ec-7780-0b99af9c49b5.png)

ここでは *PHP Unit Local* を選択します。もちろんリモートの指定もできます。

図![Test Frameworks 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/12577572-4436-7f27-ce68-fd31179e9442.png)

*PHPUnit library* の項目では、ラジオボタンでは、*Path to phpunit.phar* を選択します。そしてその下にあらわれる *Path to phpunit.phar* の欄では、phpunit の実行ファイルを指定しますが、そこでは `bin/phpunit` は指定せずに、`bin/.phpunit-x.x-x/` (`x.x-x` はバージョン番号)の下にある `phpunit` を指定します。

![ScreenShot 2019-12-07 17.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788/8c1158a0-7e39-299f-a115-1025f2882b90.png)

(Mac でファイルダイアログを使って指定する時には、`.phpunit` が隠しファイルなので表示されませんが、[⌘] + [Shift] + [.] で表示されるようになります)

ここで `bin/phpunit` を指定した時に、僕の場合は、PHPStorm が勝手に PHPUnit をアップグレードして、`.phpunit` ディレクトリに2つのバージョンがインストールされることになってしまいました。
なんだか気持ち悪いので、上記のような設定にされることをおすすめします。

*Test Runner* の項目では *Default configuration file* にチェックを入れて、その右の欄でファイルを指定します。指定するファイルは、さきほどコピーした `phpunit.xml` を指定します。

### テストを始めよう

以上で、PHPStorm 上でテストができる環境が整いました。PHPStorm では、テストメソッドの先頭の左側のマークをクリックすると、そのテストメソッドを実行できる他、プロジェクトペインの中でも `tests` ディレクトリの上や、そこに所属するディレクトリやテストクラスのファイルの上で右クリックから、テストが実行できます。

簡単にテストできる環境を整えてテスト駆動開発を実践しましょう。