Laravel は PHP のフレームワークで web サイトの構築の役に立ってくれます。web サイトということでいくつかのページで手順を踏んだ後に生まれるデータがあることがしばしばあります。例えば、ショッピングサイトで色々カートに入れて、注文した後に生まれるデータです。
また、開発中においてはよく何らかの機能を試すためのテストデータが欲しくなります。この何らかの機能とは例えば検索です。検索対象がないと試すのにも困る、といった具合です。このテストデータはあらかじめ期待されている結果からデータを作ることもあれば、単にランダムな値を入れることもあります。テストデータはテストに使うということもあり、正常なシステム中にありうるデータである必要があります(致命的バグのフェールセーフがちゃんと動くか試すためにデータベースの制約上許される不整合なデータをあえて用意することもありますが、割愛)。先に述べた複雑な手順の結果生まれるデータについてはテストデータを考えるのも一苦労です。そういった時、多数のテストデータを生成する方法を紹介します。
方針としては、実際に複雑な手順を実行してデータを生成します。ソースコードは次です。
class OrderSeeder extends Seeder { public function run(): void { foreach (range(1, 10) as $i) { // リクエストをランダムに生成 $requestParam = $this->cartRequestFactory(); if (empty($requestParam)) { // 生成に失敗したら次ループへ移動 continue; } // ブラウザからのリクエストを受け取るコントローラをインスタンス化 $controller = new CartController(); // 手順に必要なメソッドを呼び出して実行。DIを使っている場合はここで new するなりなんなりで頑張る $response = $controller->addItems(Request::create('', 'POST', $requestParam)); // 次の手順 // 前の手順のレスポンスを元に次のリクエストを生成 $requestParam = $this->shoppingRequestFactory($response); // ブラウザからのリクエストを受け取るコントローラをインスタンス化 $controller = new ShoppingController(); // 手順に必要なメソッドを呼び出して実行 $controller->storeFromCart(Request::create('', 'POST', $requestParam)); // 三手順以上ならば同様にコントローラを呼び出して実行を繰り返します。 } } // 省略 }
データを生み出すリクエストを実際に PHP の中だけで繰り返し行うわけです。まったくまっさらなところからテストデータを作ることはできませんが、テストデータを必要とする機能の前に、データを生み出す機能が実装済みならば手っ取り早く正常なテストデータを作れます。