Symfony2でDeprecatedな機能を使用していると、テスト実行時に通知してくれるPHPUnit Bridge
開発中に調べものしてて、日本語の解説サイトが見つからないから自分で英語ドキュメント読んだやつとかをメモっておけば、自分用の資料にもなるし、もしかしたら世の中の需要もあるんじゃないかと思って書いてみることにしました。
こないだSymfony2.6プロジェクトをLTSバージョンの2.7にアップグレードする作業したので、手始めはその時に見つけたツールについて。
PHPUnit Bridgeとは
本体はこちら → symfony/phpunit-bridge
READMEに大体の概要と使い方書いてあります。
自Symfony2プロジェクトに導入
composerで導入します。
composer.jsonのrequire-devセクションに以下のように追記します(この例ではバージョン2.7)。
"require-dev": {
... ,
"symfony/phpunit-bridge": "2.7"
},
追記場所はrequireセクションじゃないので注意。
これでcomposer update。
PHPUnit実行
あとは通常通りPHPUnitを実行するだけでOKです。
これまで通りテストは実行されつつ、もしDeprecated機能が使われていたらテスト結果の下にレポートされます。
$ phpunit -c app/
PHPUnit 4.7.6 by Sebastian Bergmann and contributors.
.
Time: 486 ms, Memory: 23.00Mb
OK (1 test, 1 assertion)
Remaining deprecation notices (1)
The Symfony\Bundle\FrameworkBundle\Controller\Controller::getRequest method is deprecated since version 2.4 and will be removed in 3.0. The only reliable way to get the "Request" object is to inject it in the action method: 1x
1x in DefaultControllerTest::testIndex from Asmz\BlogBundle\Tests\Controller
この例だとgetRequest()はVer.2.4からDeprecatedなメソッドだよ、って言われてます。
テスト実行中に都度レポートされるわけではなく最後にまとめて表示されるので、テスト結果と混ざって見づらくなったりしないのが良いですね。
CIなどで回す場合の注意点
ちょっと試しにこのままCircleCIでテスト回してみたんですが、デフォルト設定だとDeprecated呼び出しが検知された場合はテスト失敗とみなされるようです。
それでCI止まるのが困る場合は、以下の環境変数を設定することで回避できます。
export SYMFONY_DEPRECATIONS_HELPER=weak #デフォルト値はstrict
レポートは表示されますが、テスト失敗とはされなくなります。
まとめ
導入が簡単だし、既存処理に特に大きな変更加えることも無いので、とりあえず入れておいて損はない感じですねー。