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?

More than 1 year has passed since last update.

Laravelでデータベーステストがしたい

Last updated at Posted at 2022-02-13

メモがてら

#環境
Laravel 8.X
PHP 8.0.9
MySQL 8.0.27

自分はUbuntu上で構築したDocker環境でLaravelsailを使って開発

#テスト用DBの作成
こちらの記事を見ながら作成。

Laravel SailだとMysqlでのログインで少し止まった。ユーザー権限の問題らしく、ユーザー名をSail→rootに変えてとりあえず解決。

#ダミーレコードの準備
ダミーレコード(テストデータ)を準備する。
ダミーレコードをデータベースに一括挿入するには「Seeder」を使う。しかし、Seederはあくまでダミーを挿入する仕組みであって、量産する必要があるなら「Factory」を使う。

(こちらのサイトを参考)

##Seeder
データベースの初期値設定をする(種をまく)仕組み。

###Seederの生成

php artisan make:seeder UserSeeder

でシーダークラスを定義できる。database/seeders を確認。

###Seederを使ったモデル生成
シーダー内でDB::table->insert等を使ってレコード作成の記述をしておき、

php artisan db:seed

php artisan db:seed --class=UserSeeder //個別指定

で実行、生成可能。
詳細は公式ドキュメントを参照

##Factory
大量レコードを生産できる仕組み。あくまでSeederやテスト上で実行されるものであり、コマンドライン上で実行するものではない。

###ファクトリの生成

php artisan make:factory UserFactory

上の様なコマンドでFactoryファイルを生成できる。database/factories を確認。
「User」モデルを大量生産したいとき、「UserFactory」の名前にすることで、Userモデルを読み込んだ状態で生成される。

###モデルの定義
Factoryファイル内のdefinitionメソッドで各カラムの生成する内容を定義することができる。

database/factories/UserFactory.php
public function definition()
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
~~~

fakerプロパティを介すことで様々なランダムデータを生成することができる詳細は[こちらのライブラリ](https://fakerphp.github.io/)から


###Factoryを使ったモデル生成
後はテストファイルやシーダーファイルで以下の様な記述をする

```php
use App\Models\User;

//1つ生成
$user = User::factory()->make();

//3つ生成
$users = User::factory()->count(3)->make();

countメソッドを使えば複数個生成できる。

リレーション等の設定もできる。より詳細は公式ドキュメントを確認

##テストの準備
Artisaコマンドでテストを作成できる。

//Featureテスト
php artisan make:test UserTest

//Unitテスト
php artisan make:test UserTest --unit 

Featureテストならtests/Feature、Unitテストならtests/Unit を確認。

##テストコードを記述
まずは先頭にuse RefreshDatabaseを記述しておく

tests/Feature(Unit)/UserTest.php
class UserTest extends TestCase
{

+    use RefreshDatabase;

Illuminate\Foundation\Testing\RefreshDatabaseトレイトだが、使用するだけでデータベースをテスト終了後リセットしてくれる。
ただし、メインのDBでテストをすると、ダミーレコードじゃないものまでリセットされてしまうのでテスト用DBの設定はしっかり行う。

あとはテストコードを記述していく。
Laravelが提供しているアサ―トをいくつか載せる。

  • assertDatabaseHas

データベース内のテーブルに、指定したデータが存在するかをチェックする

$this->assertDatabaseHas('users', [
    'email' => 'sally@example.com',
]);
  • assertDatabaseMissing

データベース内のテーブルに、指定したデータが存在しないかをチェックする

$this->assertDatabaseMissing('users', [
    'email' => 'sally@example.com',
]);

他は公式ドキュメントを参照

##最後に
何か間違っている、足りない等あれば教えてください。

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?