Symfony Component Advent Calendar 2022の18日目の記事です。
最初に
SymfonyはPHPのフレームワークのひとつです。しかし、公式サイトの説明文には
Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
(SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。)
と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、Symfony上だけで動作するのではなく、他のPHPフレームワークやアプリケーションでも動作している強力なものが揃っています。
今回はそれらの中から、役立ちそうなもの・お薦めしたいものを紹介していきたいと思います。
※記事内ではautoloadのインポートは省略します。
Symfonyのデバッグツール、"Profiler"
Profiler(もしくはWebProfiler Bundle)は、アプリケーションがどのように動いたかを確認するための、デバッグツールです。
インストール
composer require symfony/profiler-pack --dev
開発専用ツールなので、--devをつけましょう
使い方
インストールすると自動で、画面下部にツールバーが表示されます。
ツールバーなどのメニューはインストールされているコンポーネントにより表示が変わります。
例えばMailer
がインストールされていればE-Mails
が活性化されますし、ORM
がインストールされていればDoctrine
が活性化されます。
また、そのほかにも画面上でAjax通信してアプリケーションにアクセスした場合は、その結果がリアルタイムにサブリクエストとしてツールに追加されたり、Dockerを使ってMailhogなど使っている場合は、Mailhogへのリンクをdocker-compose.yml
の設定を参考に自動的に貼ってくれます。
テストでProfilerをつかう
そして、機能テストでもこのProfiler
を使うことができます。
利用するには2通りのやり方があり、1つは設定ファイルで有効化する方法
when@test:
framework:
profiler: { collect: false, enable: true }
もう一つは、WebTestCase
上で有効にする方法です。
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class SomeTest extends WebTestCase
{
public function test()
{
$client = static::createClient();
$client->enableProfiler(); // テストでProfilerを利用するようにする
}
}
テストでそれぞれの値を取得する場合は、以下のようになります。
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class SomeTest extends WebTestCase
{
public function test()
{
$client = static::createClient();
$client->enableProfiler(); // テストでProfilerを利用するようにする
$client->request('GET', '/some/path');
$profile = $client->getProfile();
$profile->getCollector('db')->getQueryCount();
}
}
getCollector()
で該当のメニューのコレクターを取得し、それぞれのコレクターのメソッドを呼び出すことで、値を確認できます。
上記の例ではORM
のコレクターのgetQueryCount()
を実行してクエリー実行回数を取得しています。
それぞれのコレクターのメソッドは、インストールしたコンポーネントのDataCollector
ディレクトリに入っています。
まとめ
今回はProfiler
の紹介でした。機能テスト内で使えるのは最近知ったので、メールが送信されたかであったり、イベントが実行されたかなどもテストすることができるようになります。