LoginSignup
94
84

More than 5 years have passed since last update.

Laravel5でテスト(PHPUnit)

Last updated at Posted at 2015-05-05

Laravelでは、PHPUnitとPHPSpecの両方が最初から使えるようになっている。
Compose.jsonを見ると、

    "require-dev": {
        "phpunit/phpunit": "~4.0",
        "phpspec/phpspec": "~2.1"
    },

となっている。

最初のテスト

テストファイルの場所

Laraveでは、testはtestsディレクトリに置く。これは、phpunit.xmlの中で定義されているので必要に応じて変えることもできる。

テストファイルの命名規則

・テストファイルはファイル名を、xxxTest.phpとすることでテスト対象となる。
・メソッドは、testXXXXX()とするか、@testコメントをつけておくとtestと認識される。

テストの書き方

testsフォルダの中には、

・ExampleTest.php
・TestCase.php

の2つのファイルがあり、ExampleTest.phpは、

<?php

class ExampleTest extends TestCase {

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->call('GET', '/');

        $this->assertEquals(200, $response->getStatusCode());
    }

}

となっており、TestCase.phpを継承しているのがわかる。Laravelにおける全てのテストはこのTestCase.phpを継承する。

テストの実行

テストは、

アプリフォルダにおいて、./vendor/bin/phpunit

とすることで、testsフォルダ内のテストが実行される。ファイル別に実行したい場合は、

./vendor/bin/phpunit ExampleText.php

などとする。

簡単なWebAPIのテスト

個人的に最もよく利用するWebAPIのテストを行ってみる。まず、サンプルとして、ルートに、

Route::get('apis/echo',function(){

    $res['status'] = "OK";
    $res['message'] = "No problem";

    return Response::json($res);
});

と書いてみる。statusとしてOK。messageとしてNo problemを返す。

{"status":"OK","message":"No problem"}

SimpleApiTest.phpを作る。artisanコマンド等はないみたい。ExampleTest.phpをコピーするのが早い。

<?php

class SimpleApiTest extends TestCase {

    public function testEchoApi()
    {
        //call $this->clientは5から廃止された?
        $response = $this->call('GET', '/apis/echo');

        $this->assertEquals(200, $response->getStatusCode());

        $obj = $response->getData();
        //response->getContent()もある
        //$decode = $response->getData(true);とするとarrayで返る

        $this->assertEquals("OK",$obj->status);
        $this->assertEquals("No problem",$obj->message);
    }

}

こんな感じで書ける。callするURLの頭は/をつけたほうがいいらしい。

responseのメソッドは

・getStatusCode()
・getContent()
・getData()

などが最低限、assertは、

・assertEquals()

があればなんとかなる!?

・assertTrue
・assertFalse
・assertNull(\$var)
・assertRegExp(\$pattern,$str)

なども。詳しくはPHPUnitのページへ。

前処理の実行

テストに先立ち、実行したい処理があればsetUp()に書く。なお、その時は必ずparent::setUPを呼べと。

    public function setUp(){

        //必要らしい
        parent::setUp();

        //artisanコマンドの実行
        Artisan::call('migrate:refresh');
        Artisan::call('db:seed');

        //filterが無くなったので使えない(代わりに何かある?)
        //Route::enableFilters();
    }

migrateなど、artisanコメンド等も実行できる。

その他調べ物

・testの際に自動的にtest dbにする機構(laravel5からは変わった)
・Route::enableFilters()相当機能のがどうなったか

94
84
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
94
84