ハウツー

Compose テストでリソースをアイドル状態にする代替手段: waitUntil API(更新)

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

この記事では、Compose で waitUntil テスト API を使用して、特定の条件が満たされるまで待機する方法について説明します。これは、状況によってはアイドル状態のリソースを使用する代わりに適しています。

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


同期とは

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

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

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

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

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

large_correct_b1a355f41b.webp
テストとアプリ間の同期を修正

androidx.test と、その拡張である Compose Test は、内部でいくつかのトリックを使用しているため、この点についてあまり心配する必要はありません。たとえば、メインスレッドがビジー状態の場合、次の行を実行できるようになるまでテストは一時停止します。

ただし、すべてを知っているわけではありません。たとえば、バックグラウンド スレッドでデータを読み込む場合、テスト フレームワークが次のオペレーションを早すぎるタイミングで実行し、テストが失敗する可能性があります。最悪の状況は、この問題がごく一部のテストでしか発生せず、テストが不安定になる場合です。

オプション 1: アイドリング リソース

アイドリング リソースは、アプリがビジー状態になるタイミングをデベロッパーが決定できる Espresso の機能です。これらを使用する方法は 2 つあります。

1. テストで確認できない処理を行うフレームワークまたはライブラリにインストールする。

この好例が RxIdler です。これは RxJava スケジューラをラップします。テスト設定をテストコードから明確に分離できるため、この方法で Idling Resource を登録することをおすすめします。

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 より前: waitUntilExistswaitUntilNodeCount ヘルパーを使用]

…のように使用します。

これらの API は、テストを UI と同期する必要がある場合にのみ使用してください。すべてのテスト ステートメントで同期すると、テストコードが不必要に汚染され、メンテナンスが困難になります。

では、どのようなときに使用すればよいのでしょうか?このユースケースとして、オブザーバブル(LiveData、Kotlin Flow、RxJava)からデータを読み込むことが挙げられます。UI がアイドル状態になるまでに複数の更新を受け取る必要がある場合は、waitUntil を使用して同期を簡素化することをおすすめします。

たとえば、ビューから Flow を収集する場合:

複数のアイテムを送信します。

repository が最初の結果を返すまでに時間がかかりすぎると、テスト フレームワークは「読み込み中」がアイドル状態(collectAsState で割り当てられた初期値)であるとみなし、次のステートメントに進みます。

UI に読み込みインジケーターが表示されていないことを確認すれば、テストの信頼性を大幅に高めることができます。


テストをお楽しみください。


コード スニペットのライセンス:

Copyright 2022 Google LLC.
SPDX-License-Identifier: Apache-2.0
作成者:

続きを読む