PHPUnitを実行するPHPスクリプトを書きたい日がありました。
まあまあ時間が溶けたので備忘録です。
結論
このように書けばOK。
exec('/path/to/phpunit /path/to/tests');
参考: php – How to trigger unit testing from Laravel Artisan – Stack Overflow
特定のテスト単体を実行したい場合はこのように書けばOK。
exec('/path/to/phpunit /path/to/target /path/to/tests');
関数ごとの出力例をざっくり
記述法は結論の通り。
PHPには外部プログラムの実行ができる関数が色々あるので、出力結果を見比べてみました。
下記のようなコードで出力を確認しました。
$result = exec('/path/to/phpunit/ /path/to/tests');
var_dump(gettype($result));
var_dump($result);
exec()
成功時
var_dump(gettype($result));
string(6) "string"
var_dump($result);
string(24) "OK (1 test, 1 assertion)"
エラー発生時
var_dump(gettype($result));
string(6) "string"
var_dump($result);
string(52) "Tests: 75, Assertions: 3650, Errors: 4, Failures: 8."
エラー発生時に ERROR!
の文言が出ないが、成功時はシンプルかつ OK
と出るので良さそう。
shell_exec()
成功時
var_dump(gettype($result));
string(6) "string"
var_dump($result);
string(194) "PHPUnit 5.7.27 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 231 ms, Memory: 14.00MB OK (1 test, 1 assertion) "
エラー発生時
var_dump(gettype($result));
string(6) "string"
var_dump($result);
string(108797) "PHPUnit 5.7.27 by Sebastian Bergmann and contributors. (中略) ERRORS! Tests: 75, Assertions: 3650, Errors: 4, Failures: 8. "
OK
や ERROR!
の文言は出るものの、出力が長大で微妙……
system()
成功時
system()の出力(勝手に出る)
PHPUnit 5.7.27 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 229 ms, Memory: 14.00MB OK (1 test, 1 assertion)
var_dump(gettype($result));
string(6) "string"
var_dump($result);
string(24) "OK (1 test, 1 assertion)"
エラー発生時
system()の出力(勝手に出る)
PHPUnit 5.7.27 by Sebastian Bergmann and contributors. (中略) ERRORS! Tests: 75, Assertions: 3650, Errors: 4, Failures: 8.
var_dump(gettype($result));
string(6) "string"
var_dump($result);
string(52) "Tests: 75, Assertions: 3650, Errors: 4, Failures: 8."
system()は実行結果をすべて出力するため、 var_dump(gettype($result));
の出力内容の前にPHPUnitの実行結果がドカドカ出てきてしまい、見にくかった。
var_dump($result);
の出力結果は exec()
と同じ。見やすくて良い。
ということで
PHPUnitを外部から実行し、出力内容を利用して成否判定するようなことができるようになりました。
system()
は実行結果を出力するところまで行うため、PHPUnitの実行結果(最後の行)だけ見たい場合には、 exec()
を使うのが良さそう。