何となく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.
テストツールを触ったことなかったので新鮮…( ˘ω˘)