Skip to content

Instantly share code, notes, and snippets.

@denvernine
Last active December 15, 2020 03:48
Show Gist options
  • Save denvernine/06c46b7c1c7fbbd8238865fcf6779407 to your computer and use it in GitHub Desktop.
Save denvernine/06c46b7c1c7fbbd8238865fcf6779407 to your computer and use it in GitHub Desktop.
PHPUnitを使ったユニットテストを規定回数繰り返す方法

PHPUnitを規定回数繰り返したい!

結論

--stop-on-failure--repeat <times> オプションをつけよう!(ただしメモリ空間を共有する)

追記: --process-isolation を併用するとテストごとにプロセスを分けられる(が、誇張なしに10倍くらい時間がかかる)

結論が出るまで

テストコードをしっかり書いている場合、1-2回パスしたくらいでは何となく不安で、5回10回と自動テストを行いたい場合があると思います。というかありました。そのために何回もコマンドを打つのが嫌だったので、シェルスクリプトを作りました。

#!/bin/bash

i=1
SECONDS=0
while [[ ${?} -eq 0 ]]; do
  if [[ ${i} -eq 101 ]]; then
    exit 1
  fi

  echo "try ${i} times."
  i=`expr ${i} + 1`;
  phpunit ${@}
done

これを使って $ ~/loop.sh ./testcode.php のようにして指定回数テストを行っていたのですが、PHPUnitには規定回数実行するオプションがありました。それが --repeat オプションです。このオプションを指定すると、規定回数テストを実行してくれます。

$ phpunit --repeat=10 ./testcode.php
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

.F.......F.......F.......F.......F.......F.......F.......F....... 65 / 80 ( 81%)
F.......F......                                                   80 / 80 (100%)

Time: 90 ms, Memory: 10.00 MB

There were 10 failures:

...

おや?テスト結果を見てみると、テストが成功しているか失敗しているかに関係なく指定された回数のテストを行っています。これはこれでいいのですが、個人的にはテストが失敗されたらテストを止めてほしい。1周でほとんどのテストが失敗しているにもかかわらず10周おわるまでテストをつづけるのはちょっとマシンパワーが無駄な感じがします。

その場合は、 --stop-on-defect オプションを指定します。このオプションは最初にテストが失敗して時点でテストを終了します。 似たオプションに --stop-on-error があります。このオプションは最初にエラーが発生した時点でテストを終了します。 上記2つを合わせたオプションが --stop-on-failure です。

$ phpunit --repeat=10 --stop-on-failure ./testcode.php
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

.F

Time: 62 ms, Memory: 8.00 MB

There was 1 failure:

...

つまり phpunit --stop-on-failure --repeat=100 などでテストを回しておけば、テストで失敗があればそこで、失敗しなければ100回テストができるというわけです。

あーよかった。これで寝ている間もテストを回し続けることができますね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment