🔎

Laravel 自動テスト時に実行されている SQL 文をサクッと確認する為のスニペット

2022/03/09に公開

前書き

Feature などの自動テストを作成していると、「今、どんな SQL 文が実行された?」と思うことは、意外とあったりします。

SQL の実行クエリログを出力する方法は、@ucan-lab さんの懇切丁寧な記事があるので、大変助かります。
https://qiita.com/ucan-lab/items/753cb9d3e4ceeb245341

で、テスト時、とにかくサクッと確認したい時、どうすれば良いでしょうか?という事で、上記記事を参考にさせてもらいつつ、スニペット(メソッド)を作成しました。

tests/TestCase.php に以下を追加します。

TestCase.php
    /**
     * 実行された DB SQL を出力する
     */
    protected function dumpQuery(): void
    {
        $db = $this->app->make('db');

        $db->enableQueryLog();

        $this->beforeApplicationDestroyed(function () use ($db) {
            dump($db->getQueryLog());
        });
    }

後は、必要に応じてこのメソッドをテストメソッド内の上部の方で呼び出します。以下、サンプルです。

web.php
Route::get('', function () {
    User::all();

    return view('welcome');
});
ExampleTest.php
    function test_index()
    {
        $this->dumpQuery(); // これ!

        User::factory()->create();

        $this->get('/')
            ->assertOk();
    }

で、上記のテストを実行すると、以下の感じで出力されます。

   PASS  Tests\Unit\ExampleTest
  ✓ that true is true
^ array:2 [
  0 => array:3 [
    "query" => "insert into "users" ("name", "email", "email_verified_at", "password", "remember_token", "updated_at", "created_at") values (?, ?, ?, ?, ?, ?, ?)"
    "bindings" => array:7 [
      0 => "渡辺 晃"
      1 => "nomura.minoru@example.net"
      2 => "2022-03-08 18:53:56"
      3 => "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"
      4 => "L7qKFsWWKq"
      5 => "2022-03-08 18:53:56"
      6 => "2022-03-08 18:53:56"
    ]
    "time" => 0.06
  ]
  1 => array:3 [
    "query" => "select * from "users""
    "bindings" => []
    "time" => 0.04
  ]
]

   PASS  Tests\Feature\ExampleTest
  ✓ index

  Tests:  2 passed
  Time:   0.12s

余計なマイグレーション等は出力されないので、見やすいでしょうか。
SQL 確認後は、dumpQuery() の一文は削除します。

調子に乗って、、、

調子に乗って、プルリクを送ってみましたが、こちらは空振り(マージされず)に終わりました。
https://github.com/laravel/framework/pull/41316

せっかく、英検3級(確か)の実力😶を生かして、何とか伝わる英文を書き上げたのに…。まぁ、残念ですが、また次回頑張ります。

dumpSession() もある位ですから、dumpQuery() とかあっても悪くない気はしますが。

不具合等見つけたらコメント下さい。

Discussion