ラボ > Laravel、Lumen:テスト

laravel テストファイルのまとめ

テストファイルを作成するときに共通処理だったり、結果を見やすくしたり...したい

作成日:2025-04-11, 更新日:2025-04-17

サンプル

  • ファイルごとにコメントを出力する。メソッドごとにコメントも出力したいんだけど、諦めた
  • 頻繁に使うログインの処理も継承元にセットしておく

▼テストの結果の出力例

> php artisan test

==== ログインページ ====

   PASS  Tests\Feature\LoginControllerTest
  ✓ view dashboard

==== 履歴ページ ====

   PASS  Tests\Feature\HistoryControllerTest
  ✓ view history

  Tests:  3 passed
  Time:   1.60s

継承元

▼tests/TestBase/HogeTestCase.php

<?php
namespace Tests\TestBase;
use Tests\TestCase;
class HogeTestCase extends TestCase
{
	private static array $flg_HeadCom_many = [];
	protected static $header_comment = null; // 各テストファイルで設定

	protected function setUp(): void {
		parent::setUp();

		$class = static::class;
		if (!isset(self::$flg_HeadCom_many[$class]) && static::$header_comment) {
			fwrite(STDOUT, "\n==== " . static::$header_comment . " ====\n");
			self::$flg_HeadCom_many[$class] = true;
		}
	}

	protected function login(array $credentials = []) {

		// =============================
		// 処理に使う各値たち

		// 無視したいミドルウェア
		$middleware_many = array(
			\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class,
			// \App\Http\Middleware\●●●::class,
		);

		// 渡したい値
		$default = [
			'memberid' => 'user@example.com',
			'password' => 'secret',
			'_token' => csrf_token(),
		];
		$data = array_merge($default, $credentials);

		// 実行するURL
		$path = route('login_do');

		// =============================
		// 処理実行+結果。問題があれば、即終了
		$response = $this->withoutMiddleware($middleware_many)->post($path, $data); // 任意のミドルウェアを無視+post送信
		$response->assertRedirect(route('mypage_dashboard')); // もしくは assertStatus(302)
	}
}

各テストファイル

▼tests/Feature/LoginControllerTest.php

<?php
namespace Tests\Feature\Mypage;
use Tests\TestBase\MypageTestCase;
class LoginControllerTest extends MypageTestCase {
	protected static $header_comment = 'ログインページ';

	public function test_view_dashboard() {

		// =============================
		// ログイン
		$data = array(
			// 'memberid' => 'user@example.com',
			// 'password' => 'secret',
		);
		$this->login($data);

		// =============================
		// ダッシュボードを表示
		$path = route('mypage_dashboard');
		$response = $this->get($path);

		// =============================
		// 結果の確認: assert●●●()たち
		$response->assertStatus(200);
	}
}

メソッドを日本語化: @test

一番わかりやすいと思う...けど複数人でやるときの運用ルールを決めるのが面倒そう

▼「test_view_dashboard()」を実行したとき。日本語化前

   PASS  Tests\Feature\LoginControllerTest
  ✓ view dashboard

▼下記のように日本語化したい

   PASS  Tests\Feature\LoginControllerTest
  ✓ ダッシュボードを表示

対象となるメソッドを日本語化

「@test」を使えば、メソッド名を日本語にして良いとのこと

/**
 * @test
 */
public function ダッシュボードを表示() {}

特定のテストだけまとめて実行: @group

「@group」を設定して、実行時に指定ってのが可能

処理として「重要なもののみ」、「DBが絡む処理のみ」など目的ごとにまとめることが可能

テストファイルの各メソッド

// 省略
	/**
	 * @group abc
	 */
	public function test_view_1st() {
		// 省略
	}

	public function test_view_2nd() {
		// 省略
	}

	/**
	 * @group abc
	 */
	public function test_view_3rd() {
		// 省略
	}
// 省略

グループを指定して実行

▼「@group abc」を設定したメソッドのみ実行

> php artisan test --group=abc

関連項目