PHPUnit の @runInSeparateProcess でハマる
まとめ
@runInSeparateProcess
を書くときは、
define('PHP_BINARY', 'php')
しておいて- 場合によっては
@preservedGlobalState disabled
を指定しておく
経緯
PHPUnit は composer
経由でインストールして使用している。バージョンは 4.7.3
系。
テストメソッドに @runInSeparatedProcess
と指定して実行したら、
There were 2 errors: 1) XXXClassTest::test PHPUnit_Framework_Exception: sh: 1: cannot open ?php: No such file sh: 2: Syntax error: word unexpected (expecting ")")
と出力されてエラーになった。
PHPUnit の中身を追っていくと、どうも起動するプロセスを vendor/bin/phpunit
の 一行目 の shebang で決めているらしいことがわかった (SebastianBergmann\Environment\Runtime
) 。実際に vendor/bin/phpunit
を見てみると以下のようになっていた。
#!/usr/bin/env sh
なるほど。たしかに sh で起動しているようだ。定数 PHP_BINARY
が定義されていれば、それでプロセスを起動するので、PHPUnit の bootstrap スクリプトに定義したらなんとか実行された。
ついでにテスト対象のアプリが大量の define
定数を使用していて再定義エラーが起こるので、@preservedGlobalState disabled
も指定しておいた。