PHPUnit48とは何か
PHPUnitの4.8系からフォークして、独自でメンテナンスしてるよってだけの話です。自分以外に誰も使ってないので宣伝をします。
PHPUnitの開発体制
近年のPHPUnitは明確にサポート期間と対応するPHPバージョンを明示し、PHPコミュニティ全体に対して新しいバージョンへの移行を促す姿勢です。
それはそれで御立派なことなのですが、いまこれからPHP 5.xから7.xまでアップデートしようとするプロジェクトや、そんな環境に配慮して開発を続けるパッケージにとってはたまったものではありません。
PHPUnit48
PHPUnit 4.8系はPHP 5.3.3以上をサポートしたバージョンです。これは既にPHPUnitプロジェクトでのメンテナンスは終了したバージョンです。良いバージョンではあるのですが、PHP 7と互換性がありません。
なので、PHPUnitの4.8
ブランチから派生してphp5friends/phpunit48として別プロジェクトとして派生しました。
どんな変更を適用したかはコミット一覧の通りですが、だいたいPHP 7.0とか7.1でもエラーなく動くようにしたり、PHPUnit 7に移行しやすいように互換レイヤーを持ってきたりって感じです。
実は既に4.8系との相互運用性はなくなってしまったので、せめてphpunit49とか名付けるべきだったかもしれません。これが後の祭ってやつです。
なぜ作ったか
弊社のプロダクトをPHP5.5から7.1まで、安全に軟着陸させるためです。Fukuoka.php Vol. 25で弊社CTOが話したのは、このPHPUnit48のことです。
情報 イベントページ https://fukuokaphp.connpass.com/event/78379/ 19:30 - 19:35 始めの挨拶 @akase244 or @cakephper 2ヶ月に1回開催…scrapbox.io
PHPUnitをフォークして7と5.5両方でテストできるようにする
これがまさに大事なことです。
あたかも北風と太陽の寓話のように、古いバージョンのPHPを冷遇して配慮しないパッケージが増えることでコミュニティ全体にバージョンアップのモチベーションを喚起することはたしかに一理はありますが、現実は古いコードがアップデートできず、ますます不安全になっていくばかりです。
pixivとしては既にPHP 7.1とPHPUnit 7への移行を完了しました。しかし、個人的にメンテナンスするプロジェクト(これもおそらく自分以外は使ってない…)では、まだPHP 5.4をサポートするものがあるので現役です。
どうやって導入するの
インストールとかしないでいいです。
composerでもインストール可能(composer require --dev php5friends/phpunit
)ですが、Pharパッケージを持ってくるのが一番おすすめです。 phpunit/phpunit:”^4.8|^5.7”
のような指定方法は個人的には非推奨なので、4.8ブランチ以外は意図的に削除しました。
それで一番簡単な方法なのですが、phpunit48–4.8.40.pharをダウンロードしてきて、git add
してしまうのが一番おてがるで簡単です。
Pharパッケージについてですが、phpunit48–4.8.40.pharは直接実行可能なもの、phpunit-library-4.8.40.pharはPHPUnitをライブラリとして読み込んで独自の起動スクリプトで利用する場合のためのものです。
PHPUnitだけのためにComposerで依存関係を入れるのって割とナンセンスだなって感じてて、僕はこんな感じで修正しました。TravisCIのビルド時間も減ってハッピーな感じです。いえーい。
これからどうするの
たぶんメンテナンスしていくので、何か不具合とか見付けたら知らせてください。
おまけ: PHPUnit 7への移行
無事にPHP 5.xから移行を完了できたら、phpunit48への依存なんてさっさと外して、正規のPHPUnit 7に移行するのがオススメです。
依存クラスがリネームされた以外にPHPUnit 7系でテストが通らなくなったなと思ったら、だいたいPHPUnit5以降でbackupGlobals機能がデフォルトでは無効化されたことが原因です。phpunit.xml.dist
(またはphpunit.xml
)で設定してやると良いです。
<?xml version="1.0"?>
<phpunit bootstrap="tests/bootstrap.php" colors="true" verbose="true" backupGlobals="true">
<testsuites>
...
よかったよかった。