この記事では、Compose で waitUntil テスト API を使用して、特定の条件が満たされるまで待機する方法について説明します。これは、状況によってはアイドル状態のリソースを使用する代わりに適しています。
[2023 年の更新] 要約: Compose テスト(v1.4.0 以降)で同期するには、新しい waitUntil API を使用します。
同期とは
テストを分類する方法の一つに、スコープによる分類があります。小規模テスト(単体テスト)はアプリの小さな部分に焦点を当て、大規模テスト(エンドツーエンド)はアプリの大部分を対象とします。このテストや他の種類のテストについては、新しく更新されたテストのドキュメントをご覧ください。
Enter キーを押すかクリックして画像をフルサイズで表示
同期は、テストが次のオペレーションを実行するタイミングを認識するためのメカニズムです。検証するコードのチャンクが大きいほど、テストとの同期が難しくなります。単体テストでは、検証するコードの実行を完全に制御できます。ただし、スコープを拡大してクラス、モジュール、レイヤを増やすと、アプリがオペレーションの実行中かどうかをテスト フレームワークが判断するのが難しくなります。
Enter キーを押すかクリックして画像をフルサイズで表示
androidx.test と、その拡張である Compose Test は、内部でいくつかのトリックを使用しているため、この点についてあまり心配する必要はありません。たとえば、メインスレッドがビジー状態の場合、次の行を実行できるようになるまでテストは一時停止します。
ただし、すべてを知っているわけではありません。たとえば、バックグラウンド スレッドでデータを読み込む場合、テスト フレームワークが次のオペレーションを早すぎるタイミングで実行し、テストが失敗する可能性があります。最悪の状況は、この問題がごく一部のテストでしか発生せず、テストが不安定になる場合です。
オプション 1: アイドリング リソース
アイドリング リソースは、アプリがビジー状態になるタイミングをデベロッパーが決定できる Espresso の機能です。これらを使用する方法は 2 つあります。
1. テストで確認できない処理を行うフレームワークまたはライブラリにインストールする。
この好例が RxIdler です。これは RxJava スケジューラをラップします。テスト設定をテストコードから明確に分離できるため、この方法で Idling Resource を登録することをおすすめします。
2. テスト対象のコードを変更して、アプリがビジー状態かどうかに関する情報を明示的に公開する。
たとえば、データソースからデータを読み込んでいる間はビジー状態であることを示すように、リポジトリ(またはテスト ダブル)を変更できます。
本番環境のコードが汚染されたり、複雑なテスト ダブルが作成されたり、インストールが難しい状況が発生したりするため、これは理想的ではありません。たとえば、Kotlin Flow で Idling Resources をどのように使用しますか?最後のアップデートはどれですか?
代わりに、待機できます。
オプション 2: 待機… 間違った方法
通常、データの読み込みは高速です(特にフェイクデータを使用する場合)。テストを数秒間スリープさせるだけで済むのに、アイドリング リソースをアイドル状態にして時間を無駄にするのはなぜでしょうか?
このテストは、必要な速度よりも遅くなるか、失敗します。UI テストが数百件、数千件ある場合は、テストをできるだけ高速に実行する必要があります。
また、エミュレータやデバイスが誤動作してジャンクが発生し、そのオペレーションに 2,000 ミリ秒以上かかってビルドが中断されることもあります。テストが数百件ある場合は、大きな問題になります。
オプション 3: 適切な方法で待機する
テスト対象のコードを変更してビジー状態を公開したくない場合は、任意の時間待つのではなく、特定の条件が満たされるまで待つという方法もあります。
Compose では、ブール値を生成する別の関数を受け取る waitUntil 関数を利用できます。
2023 年 3 月 22 日更新: Compose 1.4.0 から、waitUntil API の新しいセットが追加されました。
[1.4.0 より前: waitUntilExists、waitUntilNodeCount ヘルパーを使用]
…のように使用します。
これらの API は、テストを UI と同期する必要がある場合にのみ使用してください。すべてのテスト ステートメントで同期すると、テストコードが不必要に汚染され、メンテナンスが困難になります。
では、どのようなときに使用すればよいのでしょうか?このユースケースとして、オブザーバブル(LiveData、Kotlin Flow、RxJava)からデータを読み込むことが挙げられます。UI がアイドル状態になるまでに複数の更新を受け取る必要がある場合は、waitUntil を使用して同期を簡素化することをおすすめします。
たとえば、ビューから Flow を収集する場合:
複数のアイテムを送信します。
repository が最初の結果を返すまでに時間がかかりすぎると、テスト フレームワークは「読み込み中」がアイドル状態(collectAsState で割り当てられた初期値)であるとみなし、次のステートメントに進みます。
UI に読み込みインジケーターが表示されていないことを確認すれば、テストの信頼性を大幅に高めることができます。
テストをお楽しみください。
コード スニペットのライセンス:
Copyright 2022 Google LLC. SPDX-License-Identifier: Apache-2.0
続きを読む
-
ハウツー
今回の投稿では、カメラ プレビューの上にスポットライト効果を実装し、顔検出を効果のベースとして使用するという、視覚的に魅力的な内容について詳しく説明します。
Jolanda Verhoef • 所要時間: 8 分
-
ハウツー
Android Studio の Gemini、Gemini CLI、Antigravity、または Claude Code や Codex などのサードパーティ エージェントを使用しているかどうかにかかわらず、高品質の Android 開発をどこでも実現できるようにすることが私たちの使命です。
Adarsh Fernando, Esteban de la Canal • 所要時間: 4 分
-
ハウツー
バッテリーの消耗が Android ユーザーにとって最も重要な問題であると認識し、Google はデベロッパーがより省電力なアプリを構築できるよう、さまざまな取り組みを行ってきました。
Alice Yuan • 所要時間: 8 分
メールを受け取る
Android 開発に関する最新の分析情報を毎週メールでお届けします。