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