asmz.beer

麦芽(ばくが、英語:malt)とは、麦、特に大麦の種子を発芽させたもので、ビール、ウイスキー、水飴の原料となる。(Wikipediaより)

Symfony2でDeprecatedな機能を使用していると、テスト実行時に通知してくれるPHPUnit Bridge

開発中に調べものしてて、日本語の解説サイトが見つからないから自分で英語ドキュメント読んだやつとかをメモっておけば、自分用の資料にもなるし、もしかしたら世の中の需要もあるんじゃないかと思って書いてみることにしました。

こないだSymfony2.6プロジェクトをLTSバージョンの2.7にアップグレードする作業したので、手始めはその時に見つけたツールについて。

PHPUnit Bridgeとは

Symfony2紹介ページ(英語)

本体はこちら → symfony/phpunit-bridge

READMEに大体の概要と使い方書いてあります。

自Symfony2プロジェクトに導入

composerで導入します。

composer.jsonrequire-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

レポートは表示されますが、テスト失敗とはされなくなります。

まとめ

導入が簡単だし、既存処理に特に大きな変更加えることも無いので、とりあえず入れておいて損はない感じですねー。