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
組込メソッド
メソッド | 機能 | 備考 |
---|---|---|
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 | テストが未実装 |