読もうと思ったきっかけ、参照していたもの
A Survey of Flaky Tests | ACM Transactions on Software Engineering and Methodologyを先に読み始めて、参照されていたので気になった。
メモ
論文の概要
- Seleniumで書いた自動テストのFlakyさや実行効率を挙げるための設定について調査
- 調査の範囲では、以下の結果となった
- 実行環境のリソース(メモリや、速いCPU)がある場合はChrome+Angular waitsが良い
- 実行環境のリソースが少ない場合はHtmlUnit+Thread waitsが良い
背景
- ノースカロライナ州立大学の授業で、iTrust2というOSSのアプリケーションを題材としてソフトウェア開発を学ぶコースがある
- この中で、Seleniumでの自動テストもやっている
- しかし、すべてPassするはずのテストがFailするなど、学生たちはFlakyさに悩まされることがある
- しかも授業の一環なので、Flakyだと評価や成績に影響しうる
- Flakyさを減らすにはどうすればいいか、を調べた
調査の方法
以下の条件の組み合わせで、Failの回数や実行時間についてデータをとった
- driver
- Chrome, Firefox, PhantomJS, HtmlUnit
- ウェイト戦略
- No Wait: 要素が見つからない場合即座に失敗
- Thread Wait: 固定の秒数待機(次のExplicit Waitのタイムアウト秒数と同じに設定)
- Explicit Wait: 何らかの条件を満たすまで待つ
- Angular Wait: Angularがすべてのリクエストを完了するまで待つ(Chromeのみでサポート)
- メモリ
- 2GB, 4GB, 8GB, 16GB, 32GB
- プロセッサ
- AMD C60(弱いもの), Intel E5-1620(強いもの)
- OS
- Windows 10, Linux 4.13
調査のポイントは以下5つ
- どのdriverが良いか
- どの待機方法が最も良いか
- CPUとメモリの影響はあるか
- OSの影響はあるか
- 個々のテスト間でブラウザを再起動した場合、影響はあるか
結果
- HtmlUnitはウェイト戦略によらずChromeよりFlakyになる数が少なく、実行が速い
- Thread WaitはFlakyさが少なく、Explicit Waitが最もFlaky
- CPUが高速化するとテスト実行が早くなるが、メモリの増加による影響はほぼ無く、Chrome+Angular Waitの場合のみメモリが増えるほどFlakyさが減った
- LinuxよりWindowsのほうがFlaky
- Angular Waitを使い、かつテスト間でブラウザを再起動しないことで、Flakyさと実行時間の両方で効果があった
感想
HtmlUnitやAngular Waitは過去使ったことがなかったのでその点新鮮だった。
また、面白い結果だなと思ったのが
- 固定の秒数待つ(Thread Wait)ほうが明示的な待機(Explicit Wait)よりもテスト失敗が多い
という点。過去自分がテスト自動化を教えるときには、「なるべくExplicitWaitを使いましょう、でないと自動テストが不安定になりやすいですよ」と伝えていたので、逆の結果が出ていたのが興味深い。 しかも、Thread Waitと同じ秒数のタイムアウトをExplicit Waitに設定すれば大きな影響がなく、実行時間の差は最大でも8%だったとのこと。
とはいえ、Thread Waitの場合は障害などの発生時に影響範囲が広いというデメリットがあるので、「やっぱり全部ThreadWaitだ!」とはならない。
また、Angular Waitを使った場合、という条件付きではるものの、5番目の調査で行われた「ブラウザはテストケースごとに再起動しないほうが実行が速くFlakyさも少ない」というのも直感に反していた。早いのはもちろんわかるけれども、Flakyさも減るというのが意外。よく聞く話としては、ブラウザのインスタンス起動してずっと使っていると、動作がもたつく等で不安定になりがち&いずれかのテスト失敗時に以降が芋づる式に失敗するのでやめたほうがいい、だった。ところが実行時間だけでなくFlakyさまで減るということは、ブラウザの起動と終了時に問題が起こることもそれなりにある・・・んだろうか。
あとはハードを強くするならCPUで、メモリは単に増やせばいいというわけではないらしい。これはわかる。
関連研究
- 今回は複数のDriverに関して調査をしていたが、言語バインディングごとにどれが性能がいいかを調査したもの。
- Flakyさを減らすのではなく、Flakyテストを自動で見つけるアプリケーション