--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回テストができるというわけです。
あーよかった。これで寝ている間もテストを回し続けることができますね。