DockerでPHPUnitを少し使ってみる(Composer使用)

#はじめに
Dockerをある程度使える前提で書いていきます。

『DockerでPHPUnitを少しさわってPHPのテスト少し試してみたい！』方向けです。

よろしくお願いします！:bow_tone1:

```
★テスト記述する際のお決まり事項
・Class という名前のクラスのテストは、ClassTest という名前のクラスに記述
・ClassTest は、(ほとんどの場合) PHPUnit\Framework\TestCase 
・テストは、test* という名前のパブリックメソッドとなります。(なのでtestSample()やtestA()という書き方になる)
・テストメソッドの中で assertSame() のようなアサーションメソッド (アサーション を参照ください) を使用して、期待される値と実際の値が等しいことを確かめます。

★ユニットテストを書くそもそもの目的
バグの発見と修正や コードのリファクタリングを開発者がやりやすくすること。
ソフトウェアのドキュメントとしての役割を果たすこと。
私的には同じバグを繰り返さないために書くものという感じで理解しています。

★どこをテストすべきか
ひとつのユニットテストがカバーするのは、 通常はひとつの関数やメソッド内の特定のルートだけとなる

上記内容はほぼ以下URLからの参考です。
https://phpunit.readthedocs.io/ja/latest/writing-tests-for-phpunit.html
```

様々なチェックメソッドは以下
https://phpunit.readthedocs.io/ja/latest/assertions.html#appendixes-assertions

では早速

#環境作成

以下のようにファイルを作成して、『docker-compose.yml』ある場所で`docker-compose up --build -d`を叩きます。
そうすると、<\<ipアドレス>>:81/simple以下のように表示されています。
※ポート(81の部分)は同じですがIpは各環境で違います。ちなみに私のipは`$ docker-machine ip default`で調べられます。意味は『defaultとして作成したドッカーマシンのip』

全体の構成参考画像

|![スクリーンショット 2021-02-28 19.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/82584a29-0bf3-aeae-40ab-adfff7ea00d9.png)|
|:-:|


```index.php
<?php
require_once 'sample.php';

$sample = new sample\Sample();

echo $sample->a();
```

```sample.php
<?php
namespace sample;

class Sample
{
    public function a()
    {
        return 'あ';
    }

    public function i()
    {
        return 'い';
    }
}
```

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

require_once 'sample.php';

class SampleTest extends TestCase
{
    public function testSample()
    {
        $sample = new sample\Sample();

        //同じ値、同じ型でない場合エラー
        $this->assertSame($sample->a(), 'あ');
    }
}
```

```docker-compose.yml
version: '3'
services:
  apach:
    container_name: sample-apache #作成されていると出来ないので新しく作成する場合ここの名前を変更
    build: ./  #Dockerfileを使用してコンテナ作成
    ports:
      - 81:80
    volumes:
      - ./html:/var/www/html # コンテナ var/www/html の中に/htmlの中身を入れる
```

```Dockerfile
From php:7.4-apache

RUN apt-get update \
&& apt-get install -y \
zip \
unzip

WORKDIR /var/www/html
```

<font color="red">以下の表示は右記載でお願いします。 ===>  \<\<ipアドレス\>\>:81/simple</font>

| ![スクリーンショット 2021-02-28 19.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/9a888683-3a78-ca39-2dce-61de91dc06d5.png) |
|:-:|

※以下に最終完成バージョンも含めてあげているので、もしよかったら参考にしていただければと思います。

https://github.com/sachiko-kame/samplePHPTest

#コンテナに入ってもう一仕事する

:sun_with_face:**以下コマンド今使用しているコンテナIDの確認を行う**
`$ docker ps`

:sun_with_face:**コンテナ内に以下コマンドで入る、 ※『1999d283b4f9』は上記で出力したコンテナIDを使用してください**
`$ docker exec -i -t 1999d283b4f9 bash`

:sun_with_face:**コンテナ内で以下コマンドうちcomposerのインストール**
`$ curl -sS https://getcomposer.org/installer | php`

:sun_with_face:**composerのインストールが無事行えたら以下コマンドで『PHPUnit』のインストール**
`$ php composer.phar require --dev phpunit/phpunit`
参考:https://phpunit.readthedocs.io/ja/latest/installation.html

:sun_with_face:**全ての準備は出来た！テストコードは書いてあるので、以下コマンドをコンテナ内で実行しテスト実行してみる**
`$ vendor/bin/phpunit TEST/SampleTest.php`
以下のようになればテスト行えたことが分かる


<font color="red">以下の表示は右記載でお願いします。 ===>  `$ vendor/bin/phpunit TEST/SampleTest.php`</font>

|![スクリーンショット 2021-02-28 20.03.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/0e6d7a96-ef37-7b4f-fa91-ac0118b97d2e.png) |
|:-:|

テスト実行結果参考以下URL
https://phpunit.readthedocs.io/ja/latest/textui.html

| 表示 | 意味 |
|:-:|:--|
| .  | テストが成功した際に表示されます。  |
| F  | アサーション失敗 |
| E  | テストメソッドで何かしら失敗 |
| I  | テストがふかんぜんまたは未実装|

#最後に
以上終わりです！
書き足すことあるかもですが最初に書いたものは削除しない予定です！

後HTMLでコードガバレッジ出す記事も書いたのでもしよかったら見てください！

https://qiita.com/sachiko-kame/items/bf5480f4d7c751ab28aa


#参考
https://phpunit.readthedocs.io/ja/latest/installation.html

https://phpunit.readthedocs.io/ja/latest/assertions.html#appendixes-assertions

https://teratail.com/questions/288663