0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでテスト用DBを作成してテストを実行するまでの流れ

Posted at

環境

  • WSL2
  • docker compose:2.17.3
  • PHP:8.3
  • Laravel:11.34.2
  • MariaDB:11.2.5

テスト用DBの作成

本番用DBのデータを汚さず独立性・安全性を確保するため、テスト用のDBを別途用意してテストを実行する。DB作成はmariadbにコマンドでログインして行っているが、phpMyAdminなどのツールがあればそちらで行ってもOK
DBに任意のユーザーを作成済みで、そのユーザーの接続情報を基にlaravelを構築してることを前提とする

# MariaDBにrootユーザーでログイン(パスワード入力あり)
$ mariadb -uroot -p

# 任意のDBを作成
$ create database test_db;

# きちんと作成されてるかコマンドで確認
$ SHOW DATABASES;

# 作成したユーザーに対してテストDBへの権限を付与
$ grant all on test_db.* to 【ユーザー名】;

laravel側で接続設定

1.テスト用の環境を設定するためenvファイルを準備する

# テスト用にenvファイルをコピーして、テスト用アプリケーションキーを作成
$ cp .env.example .env.testing
$ php artisan key:generate --env=testing

2.テスト用DBへの接続情報を記載するため.env.testingを編集
Docker環境のためDB_HOSTは「DBコンテナのサービス名」になっております。こちらは各々の環境に合わせて設定してください。

.env.testing
APP_ENV=testing

DB_CONNECTION=mariadb
DB_HOST=【DBコンテナのサービス名】
DB_PORT=3306
DB_DATABASE=【テストDB名】
DB_USERNAME=【ユーザー名】
DB_PASSWORD=【DBパスワード】

3.phpunit.xmlを編集
PHPのテストフレームワークであるPHPUnitの設定ファイルphpunit.xmlを編集します。
テスト環境のデータベース接続をmariadb_testingに切り替えています。
<server>タグを使うことでPHPプロセスが開始される前にこの環境変数が設定されるため、一部の設定が必要な場合には有効になるそうです。

phpunit.xml
    <php>
        <server name="APP_ENV" value="testing"/> // env → server に修正
        <env name="APP_MAINTENANCE_DRIVER" value="file"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_STORE" value="array"/>
        <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
        <server name="DB_CONNECTION" value="mariadb_testing"/> // 追加
        <!-- <env name="DB_DATABASE" value=":memory:"/> -->
        <env name="MAIL_MAILER" value="array"/>
        <env name="PULSE_ENABLED" value="false"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>

4.database.phpを編集
アプリケーションのデータベース接続設定ファイル/config/database.phpを編集。
mariadbの設定をそのまま下にコピーして部分的に編集。

database.php
        'mariadb_testing' => [ //phpunit.xmlで記述した接続情報に変更
            'driver' => 'mariadb',
            'url' => env('DB_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => 'test_db', //テスト用のDB名に変更
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => env('DB_CHARSET', 'utf8mb4'),
            'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

接続を確認

テスト用のDB接続を指定してマイグレーションを実行。エラーが出なければとりあえず設定と接続は成功です。

$ php artisan migrate --database=mariadb_testing

テストの実行

Laravelのテストファイルでは以下のように記述すればOK
本番用のDBを汚さずに色々とテストすることができます。

ExampleTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Models\User;

class ExampleTest extends TestCase
{
    use RefreshDatabase; // この記述は忘れずに
    
    public function test_the_application_returns_a_successful_response(): void
    {
        User::factory()->create();
        $response = $this->get('/');
        
        $response->assertStatus(200);
    }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?