で、ハマったこと。
※環境はお決まりの、Jenkins + Phing + phpunit + phpmd + phpcpd + git 的な感じ
アプリケーションのソースと、そのphpunitテストソースをコミットして、Jenkins→PhingXMLで自動実行したかった。
けれども、なぜかphpunitタスク実行中にアプリソースのrequire_onceやinclude_onceで、phpファイルが見つからないと怒られる。
怒られたのは、以下のような形でPHPのパスを指定していた箇所。
$_SERVER['DOCUMENT_ROOT'] . /path/from/applicationroot
調べてみてわかったこと。
$_SERVER['DOCUMENT_ROOT']
はApacheかphp.iniかで設定している。
phpunitでは、上記変数が未定義の状態になっているため、上の書き方ではファイルを見つけることができない。
これを解決するには、phpunitテストクラスのsetUpBeforeClass()で上記変数を定義してやればいい。
$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/relative/path/to/application/root";
通常、phpは他のファイルをインクルードする際、ファイルのパスをアプリケーションルートからの相対パスか、自分自身がいる場所からの相対パスで指定できる。
普通にアプリケーションルートからの相対パスで読み込めるようにするには、Phingのbatchtestタスクの中で明示的にそのアプリ&テストソースが→すみません、嘘を書きました。
置かれる場所をclasspathで指定してやればいい。
https://www.phing.info/docs/guide/stable/apcs59.html
こうした上で、アプリソースのインクルードパスをアプリケーションルートからの相対パスで書くようにすれば、タイトル通りの構成でテストの自動実行が可能になる。