読者です 読者をやめる 読者になる 読者になる

PHPUnit の @runInSeparateProcess でハマる

php

まとめ

@runInSeparateProcess を書くときは、

  • define('PHP_BINARY', 'php') しておいて
  • 場合によっては @preservedGlobalState disabled を指定しておく

経緯

PHPUnitcomposer 経由でインストールして使用している。バージョンは 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 も指定しておいた。