Laravel と PHPUnit を使ったテスト 前編 – PHPUnitの使い方

Laravel で PHPUnit を使ったテストを実施する方法を紹介していきます。はじめは基本的な PHPUnit の記述方法です。

PHPUnit の設定

PHPUnit は PHP で一般的に用いられている テストのフレームワークです。PHPUnit を使うことで複数記述されたテストコードを逐次実行し、自動テストを実現する事が出来るようになっています。

PHPUnit は Composer 経由でインストールすることが可能で、 Laravel は デフォルトの状態でコレがインストールされています。セットアップ済みの Laravel 環境で以下のコマンドを叩くとテストを実行する事が可能です。

$ ./vendor/bin/phpunit

コマンドを実行すると tests フォルダ内に格納された全てのテストファイルが実行されます。コマンドの後にファイル名を続けて特定のファイルのみ実行することも可能です。

$ ./vendor/bin/phpunit tests/Unit/ExampleTest.php 

Laravel における標準のテストの設定は、 phpunit.xml に記載されており、これを書き換えることで、テストの設定を変更する事が出来ます。

testsuites のセクションはテスト対象ファイルの場所とパターンを示しており、コレを書き換えることで任意の場所にテストファイルを配置する事ができるようになります。

    <testsuites>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    </testsuites>

php/env のセクションでは、テスト中に利用する環境変数を指定しています。

    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="MAIL_DRIVER" value="array"/>
    </php>

テストの記述

デフォルトで用意されている tests/Unit/ExampleTest.php の中にサンプルのテストの記述をみることが出来ます。

テストは Tests\TestCase クラスを継承して、test で始まるメソド名で記述しなければなりません。

また、それぞれのテストメソドは、必ず一つ以上のテスト($this->assertXXXの形式で行われる アサーション)が記述されていなければなりません。

    public function testユーザの登録テスト()
    {
        $user = app(UserService::class)->register([
          // ユーザ情報
        ])
        $this->assertInstanceOf(User::class,$user);
    }

上記のテストでは UserService クラスを用いてユーザの新規作成のテストを行っています。引数に正しいデータを渡した際に、返り値として User クラスが習得できるか、ということをテスト内で検証しています。

テストのメソド名には日本語を用いることも出来ますので、わかりやすいテスト名を使って、読みやすいテストコードを心がけましょう。

アサーション

検証に用いる assert 系の関数には様々なものがあります。

$this->assertTrue 引数が true かどうかを検証する

$this->assertEqual 引数同士が一致するかを検証する

$this->assertInstanceOf 引数同士が期待する型となるかを検証する

他にも様々な assert 系の関数が用意されており、以下の公式ドキュメントから確認することが出来ます。

PHPUnit マニュアル – 付録A アサーション

が、全てのassert 関数を記憶するのは非常に困難です。困ったときには assertTrue などの簡便な 関数を用いて、
内部で true になるような検証コードを書く、という方式でも良いでしょう。

例外の検証

例外の検証には @expectedException を用いて、テストを行うことが出来ます。

    /**
     * @expectedException ValidationException
     */
    public function testバリデーションのチェック()
    {
        $user = app(UserService::class)->register([
          // バリデーションエラーのユーザ情報
        ])
        ....
    }

@expectedException が付与されたテストでは、指定された型の例外が投げられることを期待して、投げられた場合はテスト成功、投げられなかった場合はテスト失敗とします。

php 標準の assert 関数を用いる

沢山ある PHPUnit 標準の assert 関数を用いず、PHP標準の assert 関数を用いてテストを行う事もできます。

assert 関数では,引数の評価式が true でないケースで、例外が発生するため、コレを用いてテストを行うことが出来ます。

しかし assert 関数は実行環境次第では、内容が評価されずスキップされるケースも存在します。CI 等テスト実行環境で assert 関数が正常に動作している事を確認するには以下のようなコードを利用するのがよいでしょう。

    /**
     * @expectedException \AssertionError
     */
    public function testAssert関数が有効かどうか()
    {
        assert(false);
    }
カテゴリー: PHP

コメントを残す

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