メモがてら
#環境
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メソッドで各カラムの生成する内容を定義することができる。
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を記述しておく
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',
]);
他は公式ドキュメントを参照
##最後に
何か間違っている、足りない等あれば教えてください。