Torbjornの答えには完全に同意しますが、いくつかの点を追加したいと思います。
小さく始める
ページオブジェクトパターンはテストを簡素化するための優れた方法ですが、抽象化を正しく行うには長い時間がかかることがわかります。必要なものを抽象化することから始めて、時間をかけてゆっくりと追加していきます。
付加価値を付けます
やりすぎて、エンドツーエンドの回帰テストを作成しようとしないでください。代わりに、価値を付加するテストの作成に焦点を合わせます。たとえば、アプリケーションがエラーなしで起動することを示す単一のテストは非常に有用であり、ビルドプロセスに関する早期のフィードバックを提供できます。そこから出てください。
「深い」と「浅い」のバランスをとる
ユーザーインターフェイスをテストするためのいくつかの異なる哲学があります。それらの間のミックスを確立します。
明らかなアプローチは、本番環境のような設定でアプリケーションをテストして、アプリケーションが「フロントツーエンド」で動作することを実証することです。これらは、コードのすべての部分を実行する「深い」統合テストであり、便利です。また、通常は外部サービスなどに依存しているため、非常に遅くなる可能性があります。多くの場合、信頼性を確保するには、有効な環境を確保するために、テスト実行の間にアプリケーションを再起動する必要があります。
このアプローチのわずかな変更は、スタブアウトされたサービス(偽の製品カタログ、偽の認証プロバイダーなど)を使用してアプリケーションをテストすることです。これらは、ユーザーインターフェイスが統合されたときに機能することを示す「浅い」テストです。考慮すべきネットワーク遅延などの同じ物理的制約がないため、通常は少し高速に実行されます。プレゼンテーションの詳細やその他のエッジケースにさらに焦点を当てることができます。
さらなる変更は、ユーザーインターフェイスの一部を分離し、それらをテストハーネスで実行することです。これらのテストは、アプリケーション全体を起動するのと同じオーバーヘッドがないため、以前のアプローチよりもはるかに高速に実行されます。これらのテストを使用して、色と高度に専門化されたプレゼンテーションの懸念を主張します。
安定したら繰り返す
手動の回帰テストの代わりに機能テストを作成する場合は、開発によってその機能が安定するまで待ってから、自動化を作成することをお勧めします。開発中に自動化を書き始めると、常にテストを書き直します。開発中に自動化したい場合は、覚えておいてください。小さなことから始めてください。
早期のフィードバックを得る
UIの自動テスト(機能テストとも呼ばれます)は便利ですが、非常に時間がかかる場合があります。(実行が完了するまでに数時間かかるのを見てきました。)テストスイート全体を1日1回実行すると、フィードバックループが長すぎて、誤検知やメンテナンスの問題などが発生することがわかります。
可能であれば、機能テストをビルドプロセスに統合してみてください。テストスイートに時間がかかりすぎる場合は、ビルドパイプラインがビルドの一部として重要なテストを検証できるように、いくつかのテストを統合する方法を見つけてください。