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