🦁
Laravel×Reactのログイン機能のPHPUnitでのテスト実装の流れ
Laravelでログイン機能のテストを、本番用DBに影響を与えずに実行するための手順です。
phpunit.xml
でテスト用DBの設定を行う
✅ 1. phpunit.xml
に以下の環境変数を追加します。これにより、テスト実行時はtest_db
に接続されます。
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_CONNECTION" value="mysql"/>
<env name="DB_DATABASE" value="test_db"/>
<env name="DB_HOST" value="db"/>
<env name="DB_PORT" value="3306"/>
<env name="DB_USERNAME" value="root"/>
<env name="DB_PASSWORD" value="root"/>
</php>
.env.testing
を作成
✅ 2. テスト用の環境変数ファイル.env.testing
を作成し、以下を記載します。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=root
DB_PASSWORD=root
📌 これにより、
php artisan test
またはphpunit
実行時にtest_db
が使用されるようになります。
AuthController
コード
✅ 3. 実際の<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
class AuthController extends Controller
{
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Unauthorized'], 401);
}
$token = $user->createToken('auth_token')->accessToken;
return response()->json(['token' => $token]);
}
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
$user = User::create([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => Hash::make($request->get('password')),
]);
return response()->json(['message' => 'User created successfully', 'user' => $user], 200);
}
}
✅ 4. テストコードの例
tests/Feature/AuthControllerTest.php
に以下のようなテストコードを作成します。
<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AuthControllerTest extends TestCase
{
use RefreshDatabase;
public function test_user_can_register()
{
$response = $this->postJson('/api/register', [
'name' => 'Test User',
'email' => 'test@example.com',
'password' => 'password',
'password_confirmation' => 'password',
]);
$response->assertStatus(200)
->assertJson(['message' => 'User created successfully']);
}
public function test_user_can_login()
{
$user = User::factory()->create([
'email' => 'test@example.com',
'password' => bcrypt('password'),
]);
$response = $this->postJson('/api/login', [
'email' => 'test@example.com',
'password' => 'password',
]);
$response->assertStatus(200)
->assertJsonStructure(['token']);
}
}
-
use RefreshDatabase
: テストごとにDBをリセットして、クリーンな状態にします。 -
postJson()
: APIに対してPOSTリクエストを送信。 -
assertStatus()
: レスポンスのステータスコードを検証。 -
assertJson() / assertJsonStructure()
: レスポンスのJSONデータを検証。
✅ 5. テスト用DBのマイグレーション
テスト実行前に、テスト用DBにマイグレーションを適用します。
php artisan migrate --env=testing
✅ 6. テストの実行方法
以下のコマンドでテストを実行します。
php artisan test
または
phpunit
✅ 7. 実行結果の例
PASS Tests\Feature\AuthControllerTest
✓ ユーザー登録が成功する
✓ ユーザーがログインできる
✅ 現在の環境とDB接続情報をログに出力する
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
Log::info('Current Environment', ['env' => app()->environment()]);
Log::info('DB Connection', ['db' => DB::connection()->getDatabaseName()]);
✅ ログの確認
storage/logs/laravel.log
に次のような情報が記録されます。
[2025-03-16 16:30:00] local.INFO: Current Environment {"env":"testing"}
[2025-03-16 16:30:00] local.INFO: DB Connection {"db":"test_db"}
.env
の変更が反映されない場合は
✅ もしキャッシュをクリアして再読み込みしましょう!
php artisan config:clear
php artisan cache:clear
これで、「どの環境のDBに接続しているか」と「現在のLaravel環境」を明確に確認できます!
これで、本番DBに影響を与えずに安全にテストが実行できます! 🚀
Discussion