phpunitの実行に時間がかかるので速くするための施策として、phpunitの並列実行ができるparatestを使ってみました。
実行環境その1
開発環境でまず実験
- CPU : 1.80GHz * 2
- Memory : 4GB
- PHP 5.6
- phpunit 4.4.2
- paratest 0.13.3
実行
以下のようなテスト数のアプリケーションを対象にparatestを実行
7260 tests, 15736 assertions
コマンド
$ vendor/bin/paratest -c phpunit.xml.dist --phpunit vendor/bin/phpunit -p 5
paratestはプロセス数指定のオプション-pを動かして変化があるか確かめる。
方法 | プロセス数 | Time(sec) | Memory(Mb) |
---|---|---|---|
phpunit単体 | 1 | 328 | 299.00 |
paratest | 5 | 627 | 70.25 |
10 | 601 | 70.50 |
今回の環境ではプロセス数は10まで。それを超えるとエラーになりphpunitが途中終了してしまいました。
PHP Warning: proc_open(): fork failed - Cannot allocate memory in /xxx/src/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php on line 943
結果
phpunit単体実行時よりもparatestのほうが遅くなってしまいました。
--functionalや--bootstrapのオプションなどを試してみるもあまり効果は得られず。
サーバのスペックが低くメモリが足りていない感があるので別の環境で再度試してみることにしました。
実行環境その2
CIをまわしているスペックの高めなサーバ
- CPU : 2.13GHz * 2
- Memory : 24GB
- PHP 5.6
- phpunit 4.4.2
- paratest 0.13.3
実行
対象のアプリケーションはその1と同じ。メモリ使用量はおおよそ同じなので省略します。
CIのジョブとしてphpunit, paratestを実行しその時間を計測します。
方法 | プロセス数 | Time(sec) |
---|---|---|
phpunit単体 | 1 | 585 |
paratest | 5 | 568 |
10 | 234 | |
15 | 209 | |
20 | 192 | |
25 | 164 | |
30 | 200 | |
35 | 216 | |
40 | 261 | |
45 | 171 | |
50 | 162 | |
60 | 228 | |
70 | 232 | |
80 | 168 | |
90 | 167 | |
100 | 170 |
結果
今度はプロセス数を増やすと実行時間も短縮され最大で約1/3程度になりました。
ただしプロセス数を増やしすぎてもあまり効果はないようです。50でも100でもあまり変わらない。
おまけ
上記の結果はphpunitのカバレッジなしの場合でした。
カバレッジありの場合は時間がかかるので下記1パターンだけ実施してみました。
方法 | プロセス数 | Time(sec) |
---|---|---|
phpunit単体 | 1 | 18150 |
paratest | 30 | 3060 |
5時間→50分
となりました。(短縮されても時間かかりすぎですね…)
まとめ
- paratestを使うと実行時間を1/3程度に短縮できた
- プロセス数は増やしすぎてもあまり効果がない。サーバの負荷も考慮して20~50程度で設定するとよいと考えられる
- スペックが低い(メモリが少ない)環境だと逆に遅くなるのである程度のスペックが必要