【PHP】PHPUnitでテストコードを動かしてみる

何となく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つの方法があります。

  1. 関数名を「test」から始める。
  2. @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.

テストツールを触ったことなかったので新鮮…( ˘ω˘)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です