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レコード
この記事が気に入ったらサポートをしてみませんか?