🔎
Laravel 自動テスト時に実行されている SQL 文をサクッと確認する為のスニペット
前書き
Feature などの自動テストを作成していると、「今、どんな SQL 文が実行された?」と思うことは、意外とあったりします。
SQL の実行クエリログを出力する方法は、@ucan-lab さんの懇切丁寧な記事があるので、大変助かります。
で、テスト時、とにかくサクッと確認したい時、どうすれば良いでしょうか?という事で、上記記事を参考にさせてもらいつつ、スニペット(メソッド)を作成しました。
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