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」参照

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

$this->markTestSkipped('一旦スキップ);

シードを実行しない

オーバーライド
public function setUp(): void
{
 SeedDatabaseState::$seeded = true;
 parent::setUp();
}

アサーション

メソッド一覧
アサーション 機能 備考
assertStatus ステータスコード $response->assertStatus(200);
assertExactJson Json値
assertJsonFragment Json値を含む
assertJsonStructure Json構造
assertSame $expected===$actualか否か $response->assertSame($expected, $actual);
assertEqual $expected==$actualか否か暗黙の型変換が実行されるので注意 $response->assertEqual($expected, $actual);
assertNotEqual $expected”==$actualか否か $response->assertNotEqual($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));
assertDatabaseHas レコードの値を含むか
assertDatabaseMissing レコードの値を含まないか
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' => 〜,
  ]
 ]

);

レコードのアサーション

assertDatabaseHas
指定のレコードの値を含むか
$this->assertDatabaseHas(‘tests’,
 [
  'col1' => 1,
  'col2' => 2,
 ]

);

assertDatabaseMissing
指定のレコードの値を含まないか
$this->assertDatabaseMissing(‘tests’,
 [
  'col1' => 1,
  'col2' => 2,
 ]

);

Validationエラーのアサーション

use Illuminate\Validation\ValidationException;

try {
 // テスト実行
 〜
} catch (ValidationException $e) {
 logger($e->validator->errors()->toArray());
 $this->assertArrayHasKey('キー', $e->validator->errors()->toArray());
}

assertJsonStructure
json項目が一致

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

);

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

Logのアサーション(Spy)

※テスト対象
Log::info('aaa');
Log::error('bbb');

※テスト
$spy = Log::spy();

テスト対象実行

$spy->shouldHaveReceived('info', ['aaa']);
↓も可
$spy->shouldHaveReceived('info')->with('aaa');

$spy->shouldHaveReceived('error', ['bbb']);

否定
$spy->shouldNotHaveReceived('error', ['zzz']);

テストデータ

データプロバイダ

/**
* @test
* @dataProvider updatedTestDataProvider
*
* @param bool $param1
* @param bool $param2
*
* @return void
*/

public function updatedTest(
 $param1,
 $param2,
): void {

 $param1, $param2には
 1回目:ture, true
 2回目:false, false
 が入り、1つのテストケースで2つのテストデータを用いたテストができる

 new Test($param1, $param2);
 検証

}

/**
 * Data Provider for ‘updatedTest’
 */

public function updatedTestDataProvider(): array
{
 return [
  ’全てtrue’ => [
   true, // param1
   true, // param2
  ],
  ’全てfalse’ => [
   false, // param1
   false, // param2
  ],
 ];
}

テスト結果

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

 

 
 
Laravel

前の記事

Laravel Validation
React

次の記事

React