何となくPHPUnitを触ってみたかったのでDockerを使って環境を構築してみました。
コンテナのインストール
以下のコマンドでPHPUnitのコンテナをインストールします。
docker pull phpunit/phpunit
テストコードを書く
以下のサンプルコードでは成功パターンをテストするようにしています。
<?php
// 「test」で始まる関数はPHPUnitが自動的にテストだと判断する。
// PHP Unit 6.0 以前の場合
//class SampleTest extends PHPUnit_Framework_TestCase
// PHPUnit 6.0 以降の場合
class SampleTest extends \PHPUnit\Framework\TestCase
{
public function testEqual() {
// 期待値
$expected = 5;
// 実際の値
$actual = 2 + 3;
// チェック
$this->assertEquals($expected, $actual);
}
}
注意点
ここで注意しないといけないのは、
1~4行目に書いている通りに継承するクラスをPHPUnitのバージョンに応じて変更する必要があること点です。
以下のエラーが発生した場合は切り替えてください。
PHP Fatal error: Class 'PHPUnit_Framework_TestCase' not found in [ファイル名]
PHPUnitを実行する
成功パターン
PHPUnitコンテナを利用して作成したコードを確認すると、
以下の通りにテストが無事に通りました。
PS C:\Tools\Kitematic-Windows> docker run -v [サンプルコードを置いているフォルダ]:/app phpunit/phpunit [テストファイル名] PHPUnit 6.0.13 by Sebastian Bergmann, Julien Breux (Docker) and contributors. . 1 / 1 (100%) Time: 46 ms, Memory: 2.00MB OK (1 test, 1 assertion)
失敗パターン
もし、失敗すると以下の結果が出力されます。
PHPUnit 6.0.13 by Sebastian Bergmann, Julien Breux (Docker) and contributors. F 1 / 1 (100%) Time: 50 ms, Memory: 2.00MB There was 1 failure: 1) SampleTest::testEqual Failed asserting that 1001 matches expected 5. /app/SampleTest.php:11 FAILURES! Tests: 1, Assertions: 1, Failures: 1.
「5を期待していたのに1001が入っているよ!!」と言ってくれています。
テスト対象の設定方法
テスト対象として設定するには以下の2つの方法があります。
- 関数名を「test」から始める。
- @testアノテーションを使用する。
以下はテスト対象とする関数を2つ、対象外とする関数を1つ用意したコードです。
<?php
class SampleTest extends \PHPUnit\Framework\TestCase
{
// テスト対象
public function testEqual() {
// 期待値
$expected = 5;
// 実際の値
$actual = 2 + 999;
// チェック
$this->assertEquals($expected, $actual);
}
// テスト対象
/**
* @test
*/
public function テスト対象() {
// 期待値
$expected = 0;
// 実際の値
$actual = 123 + 456;
// チェック
$this->assertEquals($expected, $actual);
}
// テスト対象外
public function テスト対象外() {
// 期待値
$expected = 0;
// 実際の値
$actual = 1 + 1;
// チェック
$this->assertEquals($expected, $actual);
}
}
実行結果を見てみると、期待通りの動作をしてくれています。
PHPUnit 6.0.13 by Sebastian Bergmann, Julien Breux (Docker) and contributors. FF 2 / 2 (100%) Time: 52 ms, Memory: 2.00MB There were 2 failures: 1) SampleTest::testEqual Failed asserting that 1001 matches expected 5. /app/SampleTest.php:11 2) SampleTest::テスト対象 Failed asserting that 579 matches expected 0. /app/SampleTest.php:24 FAILURES! Tests: 2, Assertions: 2, Failures: 2.
テストツールを触ったことなかったので新鮮…( ˘ω˘)

