この記事では、Compose で waitUntil テスト API を使用して、特定の条件が満たされるまで待機する方法について説明します。これは、状況によっては Idling Resources を使用するよりも優れた方法です。
[2023 年更新] 要約: 新しい waitUntil API を使用して、Compose テスト(v1.4.0 以降)で同期します。
同期とは
テストは、スコープによって分類できます。小規模なテスト(単体テスト)はアプリの小さな部分に焦点を当てますが、大規模なテスト(エンドツーエンド)はアプリの大部分をカバーします。このテストと他の種類のテストについては、新しく更新されたテスト ドキュメントをご覧ください。
Enter キーを押すかクリックして画像をフルサイズで表示
同期 は、次のオペレーションを実行するタイミングをテストに知らせるメカニズムです。検証するコードのチャンクが大きいほど、テストとの同期が難しくなります。単体テストでは、検証するコードの実行を完全に制御できます。ただし、スコープを拡大してクラス、モジュール、レイヤを増やすと、アプリがオペレーションの実行中かどうかをテスト フレームワークが判断するのが難しくなります。
Enter キーを押すかクリックして画像をフルサイズで表示
androidx.test と、その拡張である Compose Test では、この問題をあまり気にする必要がないように、内部でいくつかの処理を行っています。たとえば、メインスレッドがビジー状態の場合、次の行を実行できるようになるまでテストは一時停止します。
ただし、すべてを把握できるわけではありません。たとえば、バックグラウンド スレッドでデータを読み込むと、テスト フレームワークが次のオペレーションを早すぎるタイミングで実行して、テストが失敗する可能性があります。最悪のケースは、これがごく一部のタイミングでしか発生しないため、テストが不安定になることです。
オプション 1: Idling Resources
Idling Resources は、デベロッパーがアプリのビジー状態を判断できる Espresso の機能です。これを使用するには、次の 2 つの方法があります。
1. テストで確認できない処理を行うフレームワークまたはライブラリにインストールする。
この好例が RxIdler で、RxJava スケジューラをラップします。Idling Resources を登録する際は、テストの設定をテストコードから分離できるため、この方法をおすすめします。
**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 分
-
方法
Google は、Android ユーザーがバッテリーの過剰な消耗を最も懸念していることを認識し、デベロッパーが電力効率の高いアプリを構築できるよう、さまざまな取り組みを行っています。
Alice Yuan • 所要時間: 8 分
-
方法
デバイス上のモデルとクラウドモデルの両方を使用して AI 対応機能の例を提供し、ユーザーに快適なエクスペリエンスを提供できるようデベロッパーを支援したいと考えています。
Thomas Ezan, Ivy Knight • 所要時間: 2 分
メールを受け取る
Android 開発に関する最新の分析情報を毎週メールでお届けします。