@ HTML

HTMLの記述ルール

PHPUnitは、PHPでクラスや関数などプログラムを構成する小さな単位(ユニット)で個々の動作を確認するための単体(ユニット)テストをするツールです。

PHPUnit のインストール

PHPUnitは PHP のパッケージ管理ツール Composer を使ってインストールすることができます。

Composer は、https://getcomposer.org/ から無料でダウンロードして使うことができます。

Composer をインストール後、開発用ディレクトリに composer.json を設置し、次のように記述します。

composer.json

{
    "require-dev": {
        "phpunit/phpunit": "*"
    }
}

次にコマンドラインで開発用ディレクトリに移動し、次のコマンドを実行します。

$ composer update

コマンドを実行すると、vendor ディレクトリと composer.lock ファイルが生成されます。

/sampleapp(開発用ディレクトリ)
├── /vendor
├── composer.json
└── composer.lock

テストケースの作成

開発用ディレクトリに src ディレクトリと test ディレクトリを作成します。

src にはユニット(単体)テストの対象となるクラスや関数を記述したファイルを、test にはテストケースを記述したファイルを格納しします。

/sampleapp(開発用ディレクトリ)
├── /src
│  └── Calc.php // テストの対象ファイル
├── /test
│  └── CalcTest.php // テストケースファイル
├── /vendor
├── composer.json
└── composer.lock

composer.json を次のように変更します。

composer.json

{
    "require-dev": {
        "phpunit/phpunit": "*"
    },
    "autoload": {
        "psr-4": {
            "sampleapp\\": "src/"
        }
    }
}

コマンドラインで開発用ディレクトリに移動して、次のコマンドを実行します。

$ composer dumpautoload

コマンドを実行すると、vendor\autoload.php が更新されます。

次にテスト対象となるクラスを用意します。

今回は src\Calc.php というファイルを作成し、次のようなクラスを記述します。

Calc.php

<?php
namespace sampleapp;

class Calc
{

    /**
     * 足し算
     */
    public function add($x, $y)
    {
        return ($x + $y);
    }

    /**
     * 引き算
     */
    public function sub($x, $y)
    {
        return ($x - $y);
    }
}

テスト対象のクラスが完成したら、test ディレクトリに CalcTest.php ファイルを作成し、次のように記述します。

ここではテストコードは空の状態の実行可能なテストケースを作成し、書式を確認しておこうと思います。

CalcTest.php

<?php

require_once('vendor/autoload.php');

class CalcTest extends PHPUnit\Framework\TestCase {
    // テストコード
}
  1. Calc という名前のクラスのテストは、CalcTest という名前のクラスに記述します。
  2. テストクラス(ここでは CalcTest ) は、(ほとんどの場合) PHPUnitFrameworkTestCase を継承します。
  3. Composer を使用して PHPUnit をインストールした場合は、テストケースを記入するファイルの先頭に以下のように記述します。
    require_once('vendor/autoload.php');
    

ユニットテストの実行

コマンドラインで開発用ディレクトリに移動して、次のようにしてテストを実行します。

$ vendor\bin\phpunit test\

コマンドが実行されると、test ディレクトリ内のファイルをテストケースとしてテストが実行されます。

今回は、テストコードが空の状態でテストを実行したため、以下のようなエラーメッセージが出力されます。

PHPUnit 6.4.3 by Sebastian Bergmann and contributors.

W                                                                   1 / 1 (100%)

Time: 309 ms, Memory: 4.00MB

There was 1 warning:

1) Warning
No tests found in class "CalcTest".

WARNINGS!
Tests: 1, Assertions: 0, Warnings: 1.

テストコードの作成

  1. テストは、test* という名前のパブリックメソッドとなります。
  2. あるいは、@test アノテーションをメソッドのコメント部で使用することで、それがテストメソッドであることを示すこともできます。
  3. テストメソッドの中で assertEquals() のようなアサーションメソッドを使用して、期待される値と実際の値が等しいことを確かめます。

SampleTest.php に、テストコードを記述してみます。

CalcTest.php

<?php
require_once ('vendor/autoload.php');

class CalcTest extends PHPUnit\Framework\TestCase
{

    protected $object;

    protected function setUp()
    {
        // テストするクラスのインスタンスを生成
        $this->object = new sampleapp\Calc();
    }

    /**
     * 足し算関数の検証
     */
    public function testAdd()
    {
        // 引数に3,5を渡すと8が返ってくることを確認する
        $this->assertEquals(8, $this->object->add(3, 5));
        // 引数に15,30を渡すと45が返ってくることを確認する
        $this->assertEquals(45, $this->object->add(15, 30));
    }

    /**
     * 引き算関数の検証
     */
    /**
     * @test
     */
    public function Sub()
    {
        // 引数に10,3を渡すと7が返ってくることを確認する
        $this->assertEquals(7, $this->object->sub(10, 3));
        // 引数に3,8を渡すと-6が返ってくることを確認する(エラーになるはず)
        $this->assertEquals(- 6, $this->object->sub(3, 8));
    }
}

コマンドラインで開発用ディレクトリに移動して、次のようにしてテストを実行します。

$ vendor\bin\phpunit test\

テストの実行結果は以下のように出力されます。

PHPUnit 6.4.3 by Sebastian Bergmann and contributors.

.F                                                                  2 / 2 (100%)

Time: 455 ms, Memory: 4.00MB

There was 1 failure:

1) CalcTest::Sub
Failed asserting that -5 matches expected -6.

C:\xampp\htdocs\sampleapp\test\CalcTest.php:37

FAILURES!
Tests: 2, Assertions: 4, Failures: 1.

PHPUnit マニュアル