LaravelでPHPunitを動かしてみる

Posted in Laravel on 9月 29, 2016

プログラムを書くのは好きだけどテストはどうも好きじゃないなという人も多いかと思います。 また、初心者にとっては、テストに行く前に学ばなければならないことがあるので、テストについて考える余地もないかもしれません。

しかし、Laravelには、インストール直後からPHPUnitが実行できるテスト環境が準備できているので、何の知識がなくても実行することができます。

※Laravel5.3の環境で実行しています。

LaravelでのPHPUnitの環境

composer.jsonの中身を確認してみるとphpunitが含まれていることがわかります。

"require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~5.0",    ←ここ
        "symfony/css-selector": "3.1.*",
        "symfony/dom-crawler": "3.1.*"

インストール直後からテストの環境はできているので、何も考えずにインストールディレクトリで、phpunitコンドを実行するだけで、テストが開始されます。

$ phpunit
-bash: phpunit: コマンドが見つかりません

上記のエラーが発生した場合は、phpunitへのパスが設定されてません。phpunitの実行ファイルは、vendor/bin/にあるので、今度は、vendor/bin/phpunitを実行して下さい。

$ vendor/bin/phpunit
PHPUnit 5.5.5 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 107 ms, Memory: 10.50MB

OK (1 test, 2 assertions)

グリーンとOKとが出た場合は、テストに成功しています。

実行されているテストの実体は、testsディレクトリにあるExampleTest.phpです。

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->visit('/')
             ->see('Laravel');
    }
}

内容は、ルートディレクト(/)にアクセスして、そのページにテキストLaravelがあるかどうかのチェックを 行っています。

ルーティングのファイルweb.phpで確認するとルートディレクトリ(/)にアクセスすると welcomeのビューが表示されます。

Route::get('/', function () {
    return view('welcome');
})

welcomeビューの中身には、テキストLaravelがあるので、テストはOKということになります。

<div class="content">
                <div class="title m-b-md">
                    Laravel
                </div>

チェックするテキストを別のものに変えてみると

public function testBasicExample()
    {
        $this->visit('/')
             ->see('OctoberCMS');
    }
$ vendor/bin/phpunit
PHPUnit 5.5.5 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 103 ms, Memory: 10.50MB

There was 1 failure:
  ・
・
Failed asserting that the page contains the HTML [OctoberCMS]. Please check the content above.

HTMLにOctoberCMSを含むページがないので、内容をチェックして下さいといったエラーの内容も 親切に出力してくれるので、エラー内容がなにかのか確認することができます。

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

成功した場合は、グリーンでしたが、失敗しるとレッドで表示されます。

Laravelのドキュメントを参考にしながら、簡単なテストをもう一つ実施してみます。

ルートにアクセスして、テキストAbout Usをクリックするとクリックした先のページが/about-us というテストです。

public function testBasicExample()
{
    $this->visit('/')
         ->click('About Us')
         ->seePageIs('/about-us');
}

このテストを成功させるためには、welcomeビューにAbout Usのリンクを入れて、web.phpで/about-usを 追加する必要があります。

resources/view/welcome.blade.php

<div class="content">
                <div class="title m-b-md">
                    <a href="aboutus">About Us</a>
                </div>

routes\web.php

Route::get('/', function () {
    return view('welcome');
});

Route::get('/aboutus', function () {
    return 'This is aboutus page';
});

phpunitを実行して、OKグリーンがでればテストに成功です。

$ vendor/bin/phpunit
PHPUnit 5.5.5 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 109 ms, Memory: 10.50MB

OK (1 test, 2 assertions)

もし、web.phpにaboutusがない状態でテストするとステータスコード404 NOT FOUNDのエラーのため テストが失敗していることがわかります。

$ vendor/bin/phpunit
PHPUnit 5.5.5 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 115 ms, Memory: 11.00MB

There was 1 failure:

1) ExampleTest::testBasicExample
A request to [http://localhost/aboutus] failed. Received status code [404].

非常に簡単な例でしたが、少だけLaravel環境でのPHPunitの理解が深まったのではないでしょうか。 これを機にPHPunitを使ったテストに興味を持って頂ければと思います。