世界的な会社がどうテストしているのか、ちょっとテスト関連のベストプラクティスを探して読んでみています。
個人的にはrobot pattern testingはちょっとした収穫でした。
またかなりSnapshot testが行われていることが印象的でした。
詳しくは以下
(ユニットテストは大事的なのが書いてあるんですが、知らなかったところ中心で書いているので飛ばしています)
Snapshot test
IntegrationテストやUI/E2Eテストの特別な形。スクショをとって、保存されている画像と比較する。データは通常モックが使われる。違うとテストが失敗する。失敗の理由として画像が使われる
Snapshot testのUberでの事例
- iOSではFacebookからiOSSnapshotTestCaseを引き継いで、多用していた
- デバイスのサイズが多様だったのでAndroidで適切なスナップショットを行うための労力がこのプラットフォームでは高すぎると考えたのでAndroidでは行わないことを決定した
- リポジトリにスナップショットの画像を保存していたが、チェックアウトや更新が遅くなったので、リポジトリ外に画像を移動させ、mainブランチの変更をCIが追跡する形になった。
- CIでは変更が検出されるとタスクを作成し、変更が予期されるものである場合は開発者はチケットを閉じ、そうでない場合は問題を解決するための差分を作成する。
- リポジトリ内にない画像への参照をチェックされないようにするワークアラウンドを行うツールを構築した。
Snapshot testについて
- 様々なアプリで使われるが、どんなアプリにもフィットするわけではない。有用性の多くはアプリに依存する。
- 気づかないうちに変更されたくない「core」フローをカバーすることが良いスタートになる
Automated UI testing
大きくスケールしたアプリではかなりツールが制限される。
Appleの UI testing out of the boxはマニュアル動作を保存して再生できる。少しのケースではうまくいく。
https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/09-ui_testing.html
大きなアプリではもっと頑丈な解決策や、robotやpage objectのようなアプローチのエンジニアリングが必要になる。robotやpage objectを作るのは難しくなく、スケールする。
robot pattern testing
https://www.capitalone.com/tech/software-engineering/robot-pattern-testing-for-xcuitest/
(Androidの人は元になったこっちがいいかも)
https://jakewharton.com/testing-robots/
page object pattern
https://medium.com/wantedly-engineering/introducing-page-object-pattern-in-ios-74e46c664d26
20〜30個以上のUIテストを書いているチームはテスト実行にどれだけ時間がかかるかという問題に直面する。またこれをmasterにマージする前に実行するかしないのかというジレンマに陥る。
この問題は2つのことを浮かび上がらせる
- テストピラミッドの中でどこに力をそそぐのか考える。UIテストは重要だが、最もコストがかかる。他のテストに適切なレベルの投資をしているかを考える必要がある。
- 大規模なUIテストは多くの利点がある。Two Years of UI testingではそのためのいくつかの解決策を紹介している。UberではUIテストを並行に実行するために、flakey testを検知するために、また効果追跡するためにかなりの時間を費やした。
データをモックすることのメリデメがある。
メリット:スピード、エッジケース、信頼性、繰り返し利用できる。デメリット: データが古くなる、テストデータを管理する必要がある。データの変更のテストができない。
テスト戦略は企業やチームによって大きく異なる。
Spotify ~32,000 ユニットテストとインテグレーションテスト, ~1,600 スナップショットテスト, ~500 UIテスト
Airbnb ~10,000 ユニットテスト and ~30,000 スナップショットテスト
Shopify had ~8400 ユニットテスト, ~2300 スナップショットテスト and ~20 E2Eテスト
Uber 数千のユニットテスト, 数千のスナップショットテスト, 少しのUI tests と 手動テスト
Lyft 数千のユニットテスト, いくつかのスナップショットテスト, いくつかのUIテスト と 手動テスト
...