Laravel PHPUnit

phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit ~>
 <testsuites>
  <testsuite name="Unit">
   <directory suffix="Test.php">./tests/Unit</directory>
  </testsuite>
  <testsuite name="Feature">
   <directory suffix="Test.php">./tests/Feature</directory>
  </testsuite>
 </testsuites>
 <filter>
  <whitelist processUncoveredFilesFromWhitelist="true">
   <directory suffix=".php">./app</directory>
  </whitelist>
 </filter>
 <php>
  <env name="APP_ENV" value="testing"/>
  ~
  <server name="DB_CONNECTION" value="
  <server name="DB_DATABASE" value="
  ~
 </php>
</phpunit>

APP_ENV

テストで使用する環境名
「testing」を設定した場合は「.env.testing」を参照しにいく
.envファイルについては「Laravel 設定ファイル」参照
環境名については「Laravel 設定ファイル」参照

設定の上書きを強制する必要がある場合がある
<env name="APP_ENV" value="testing" force="true" />

DB

DB_CONNECTION
テストで使用するコネクション名

DB_DATABASE
テストで使用するDB名

コマンド

コマンド 機能 備考
phpunit 全テスト実行 プロジェクトディレクトリにて
./vendor/bin/phpunit
phpunit -v
tests/〜/テストクラス名.php
全テスト実行 指定テストクラス
phpunit -v
--filter "メソッド名"
tests/〜/テストクラス名.php
テスト実行 指定テストクラスの指定メソッド
phpunit --stop-on-failure 失敗時に止める
phpunit --debug 詳細情報を出力
phpunit -d memory_limit=128M テスト実行時のみphp.iniの設定を変える

テストコード

テストクラス

※~Test.php
namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
 public function test_PhpUnitController_index()
 {
  $response = $this->get('/test');

  $response->assertStatus(200);
 }

 public function test_PhpUnitController_json()
 {
  テスト2
 }
}

リクエスト

GET
$response = $this->get('/test');

POST(パラメータ無し)
$response = $this->post('/test');

POST(パラメータ有り)
$request = [
 'param1' => 1,
 'param2' => 'aaa',
];
$response = $this->post('/test', $request);

レスポンス

コンテンツ取得
$content = $response->content();

JSONコンテンツ変換
$json = json_decode($response->content());
$id = intval(json_decode($response->content())->{'id'});

Mock

自動テストツール PHPUnit Mockey」参照

アサーション
アサーション 機能 備考
assertStatus ステータスコード $response->assertStatus(200);
assertExactJson Json値
assertJsonFragment Json値を含む
assertJsonStructure Json構造
assertSame $expected===$actualか否か $response->assertSame($expected, $actual);
assertEqual $expected==$actualか否か $response->assertEqual($expected, $actual);
assertLessThan $expected<$actualか否か $response->assertLessThan($expected, $actual);
assertLessThanOrEqual $expected<=$actualか否か $response->assertLessThanOrEqual($expected, $actual);
assertGreaterThan $expected>$actualか否か $response->assertGreaterThan($expected, $actual);
assertGreaterThanOrEqual $expected>=$actualか否か $response->assertGreaterThanOrEqual($expected, $actual);

assertThat オブジェクトが同じか否か $response->assertThat($expected, is($actual));
assertRegExp 文字列が含まれるか? $response->assertRegExp('/文字列/', $actual);
expectException 例外が発生する $response->expectException(クラス名::class);
expectExceptionMessage 例外メッセージを取得する $response->expectException(文字列);

 

Jsonのアサーション

assertEquals
内容が一致
〜assertEquals($response->content(), 'AAAAA');

assertExactJson
内容が一致
$response->assertExactJson(
 [
  'item1' => 123,
  'item2' => 456,
 ]
);

assertJsonFragment
指定のjsonを含む
$response->assertJsonFragment(
 [
  'data' => [
   'item1' => 〜,
   'item2' => 〜,
  ]
 ]

);

assertJsonStructure
json項目が一致

$response->assertJsonStructure(
 [
  'data' => [
   '*' => [
    'item1',
    'item2',
  ]
 ]

);

jsonのloop
foreach ($response->json('data.*.item1') as $item1) {
 〜
}

組込メソッド
メソッド 機能 備考
setUp 各テストメソッド実行前に実行される
tearDown 各テストメソッド実行後に実行される
setUpBeforeClass テストケース実行前に実行される
tearDownAfterClass テストケース実行後に実行される

テスト結果

記号
記号 機能 備考
「. 」(ドット) テスト成功
F テスト失敗
E テストが危険としてマーク
S テストをスキップした
I テストが未実装

 

 
 

前の記事

Laravel Validation

次の記事

React