方法

Compose テストで Idling Resources の代わりに使用できる waitUntil API(更新)

所要時間: 3 分
Jose Alcérreca
デベロッパー リレーション エンジニア

この記事では、Compose で waitUntil テスト API を使用して、特定の条件が満たされるまで待機する方法について説明します。これは、状況によっては Idling Resources を使用するよりも優れた方法です。

[2023 年更新] 要約: 新しい waitUntil API を使用して、Compose テスト(v1.4.0 以降)で同期します。


同期とは

テストは、スコープによって分類できます。小規模なテスト(単体テスト)はアプリの小さな部分に焦点を当てますが、大規模なテスト(エンドツーエンド)はアプリの大部分をカバーします。このテストと他の種類のテストについては、新しく更新されたテスト ドキュメントをご覧ください。

Enter キーを押すかクリックして画像をフルサイズで表示

large_0_9n_Nqkt_HHUTOQ_In_AI_b113b43bcf.png
アプリのさまざまなテスト スコープ

同期 は、次のオペレーションを実行するタイミングをテストに知らせるメカニズムです。検証するコードのチャンクが大きいほど、テストとの同期が難しくなります。単体テストでは、検証するコードの実行を完全に制御できます。ただし、スコープを拡大してクラス、モジュール、レイヤを増やすと、アプリがオペレーションの実行中かどうかをテスト フレームワークが判断するのが難しくなります。

Enter キーを押すかクリックして画像をフルサイズで表示

large_correct_b1a355f41b.webp
テストとアプリ間の正しい同期

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 ミリ秒以上かかる場合があり、ビルドが失敗します。テストが数百もある場合は、大きな問題になります。

0_DOCdjq-JpPDGV5OB.png

オプション 3: 処理を待機する(正しい方法)

テスト対象のコードを変更してビジー状態を公開したくない場合は、任意の時間待機するのではなく、特定の条件が満たされるまで待機する方法もあります。

1_jIYFxE4qlHXMi2SwW6JemA.png

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
作成者:

続きを読む