見出し画像

Laravel学習記録 #022 自動テストの準備について学ぶ

Laravelの自動テストについて学習したものをメモ程度にまとめてます。
今回はテスト準備編です。

テスト準備

Laravelで自動テストやろーってなったらざっくり以下が必要ですよね。

  • テストDBを作成

  • 設定ファイル用意

  • テストデータ用意

  • テストコード用意(別でまとめます。)


テストDBを作成

テスト実行時に既存のDBを汚染しないために、テスト用のDBを用意します。ローカルのDBでもドッカーでもなんでも。
今回はphpmyAdmin使って元のDBから構造のみをコピーしたDBを作成しました。(元のDBを選択 > 操作タブ > データベースのコピー先 で 構造のみを選択、作成するデータベース名を入れて実行)
構造だけコピーする理由はテスト開始時にデータを入れる運用にするためです。


設定ファイル用意

.env.testingファイルを用意します。
これを用意しておかないと、テスト実行時に元の.envの情報でやってしまった。。。なんてことになりかねないので注意。

.envファイルをコピーして
接続先情報を書き換えます。
ポートやホストなども異なる場合は書き換え必要

# .env.testing

# 接続先をテストDBにする
DB_DATABASE=mysql_testing

.env.testingファイルが用意できたら
phpnit.xmlファイルを開きます。
APP_ENVのvalueがtestingになっていることを確認します。

 <env name="APP_ENV" value="testing"/>

このようになっていれば、先程作成した.env.testingの設定でテスト実行されます。


テストデータ用意

テストデータを用意します。
テストデータを用意するのって結構めんどい。。。
決めうちの値で確認するときは、手作業で用意しますが
ある程度の規則でランダムの値が生成できれば良いって時は
Factoryをという機能を使います。


□ Factory

Factoryは大量のデータを生成できる機能で
一般的にModelと関連付けて使います。

実際に使うとこんな感じです。

①ファイル生成
database/factories/SampleFactory.phpが作成されます。

 php artisan make:factory Sample


②モデルの関連づけ
生成されたファクトリークラスでモデルを$modelプロパティに代入して紐付けます。

use App\Models\Sample;   // <-追加

class SampleFactory extends Factory
{

    protected $model = Sample::class;     // <-追加

③生成データ
definitionメソッドに連想配列で、生成したいデータを指定します。
fakerというダミーデータ生成ライブラリを使えるので、そのルールに従って作ります。

 public function definition()
    {
        return [
            // 文字から10文字までのアルファベットと数字のランダムな組み合わせ
            'code'   => $this->faker->regexify('[a-zA-Z0-9]{1,10}'),
            // ['1', '2', '3']からランダム
            'select'       => $this->faker->randomElement(['1', '2', '3']),
            // 1から99までのランダムな整数
            'rank'      => $this->faker->numberBetween(1, 99),
            // ランダムな20文字のテキスト
            'remark'    => $this->faker->realText(20),
        ];
    }

ここまでできたらファクトリー側はOK

④モデル設定
HasFactoryトレイトを有効にします。(モデル生成時に最初からあります。)Factoryのcreateメソッドでデータを登録するため$fillableを追加しましょう。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    use HasFactory;
    
    protected $fillable = [
        'code', 
        'select',
        'rank', 
        'remark'
    ];
}

これでOKです。

あとは、テスト実行時に以下のようにしてデータを挿入したり
Seederを使って登録することができます。

$sample = Sample::factory()->create(); // 1レコード
$sample = Sample::factory(2)->create();  // 2レコード

この記事が気に入ったらサポートをしてみませんか?