LoginSignup
7
6

More than 5 years have passed since last update.

paratestを使ってみた

Posted at

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程度で設定するとよいと考えられる
  • スペックが低い(メモリが少ない)環境だと逆に遅くなるのである程度のスペックが必要
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6