Docker+PHPUnitを使ってみよう

Docker+PHPUnitを使ってみました。下記を参考にしています。なお、こちらではPHP 7.0 + PHPUnit 6.5 での書き方を紹介しています。PHPUnit 7.0 を使う場合は PHP 7.1以上が必要なようです。

CakePHP3でのテストを調べていたのですが、その前にDocker+PHPUnitかな、と思って調べました。CakePHP3だと下記があるようです。

用意するファイル その1

PHPUnitの設定ファイル phpunit.xml

<phpunit
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.5/phpunit.xsd"
        backupGlobals="true"
        backupStaticAttributes="false"
        bootstrap="tests/bootstrap.php"
        cacheTokens="false"
        colors="false"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        forceCoversAnnotation="false"
        mapTestClassNameToCoveredClassName="false"
        printerClass="PHPUnit\TextUI\ResultPrinter"
        processIsolation="false"
        stopOnError="false"
        stopOnFailure="false"
        stopOnIncomplete="false"
        stopOnSkipped="false"
        stopOnRisky="false"
        testSuiteLoaderClass="PHPUnit\Runner\StandardTestSuiteLoader"
        timeoutForSmallTests="1"
        timeoutForMediumTests="10"
        timeoutForLargeTests="60"
        verbose="false">
        <testsuites>
          <testsuite name="Sample Test Suite">
            <file>./sampleTest.php</file>
          </testsuite>
        </testsuites>
</phpunit>

テスト起動用 tests/bootstrap.php

<?php

require_once __DIR__ . '/../vendor/autoload.php';

composerでPHPUnitをインストールするので、composer.json

composer.json 
{
    "name": "phpunit",
    "description": "PHPUnit",
    "require": {
        "phpunit/phpunit": "6.5.*"
    }
}

用意するファイル その2

テスト対象のSample.php

<?php

class Sample
{
    public function hello($v) 
    {
        return 'Hello ' . $v;
    }
}

Sampleクラスをテストする sampleTest.php

<?php
require 'Sample.php';
use PHPUnit\Framework\TestCase;

class sampleTest extends TestCase
{
    private $sample;

    public function setUp()
    {
        $this->sample = new Sample();
    }

    public function tearDown()
    {
    }

    public function testサンプル()
    {
        $this->assertTrue(true, "sample test comment");
    }

    /**
     *  @dataProvider exampleSample
     */
    public function test値1にHelloがつくこと($value1, $expected)
    {
        $this->assertEquals($expected, $this->sample->hello($value1));
    }

    public function exampleSample()
    {
        return [
            [ 'PHP', 'Hello PHP' ],
            [ 'Python', 'Hello Python' ],
            [ 'Java', 'Hello Java' ],
        ];
    }
}

インストール

Dockerのcomposerイメージを使います。

$ docker run  -u $UID:$GROUPS --rm -it -v $PWD:/app -w /app composer install

実行

vendor/bin/phpunitがインストールされているはずなので、これをphp:7.0-apacheのイメージを使って実行します。最初は、sampleTest.phpにassertTrue()へfalseを渡しているテストがあるので必ず失敗します。sedコマンドでfalseをtrueとなおして実行するとテストがすべて成功します。最後のsedは元にもどしています。

$ docker run -u $UID:$GROUPS  --rm -it -p 80:80 \
   -v $(pwd):/var/www/html \
   --name php70-apache php:7.0-apache \
     /var/www/html/vendor/bin/phpunit -c phpunit.xml
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

F...                                                                4 / 4 (100%)

Time: 37 ms, Memory: 4.00MB

There was 1 failure:

1) sampleTest::testサンプル
sample test comment
Failed asserting that false is true.

/var/www/html/sampleTest.php:20

FAILURES!
Tests: 4, Assertions: 4, Failures: 1.


$ sed -i 's/false/true/' sampleTest.php 
$ docker run -u $UID:$GROUPS  --rm -it -p 80:80 \
   -v $(pwd):/var/www/html \
   --name php70-apache php:7.0-apache \
     /var/www/html/vendor/bin/phpunit -c phpunit.xml
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

....                                                                4 / 4 (100%)

Time: 40 ms, Memory: 4.00MB

OK (4 tests, 4 assertions)
$ sed -i 's/true/false/' sampleTest.php 
同じタグの記事: Docker
同じタグの記事: PHP
同じカテゴリの記事: Program
関連書籍: PHP