web-dev-qa-db-ja.com

エスプレッソアイドリングリソースの使用方法

シナリオは、ユーザーが「ダウンロード」ボタンをクリックすると、データ(音楽/画像など)がインターネットからダウンロードされ始めるというものです。ダウンロードが完了すると、ボタンはラベルテキストを「開く」に変更します。次に、ユーザーはその「開く」ボタンをクリックします。私がソファでやったことは:

_onView(allOf(withId(R.id.button),withText("Download"))).check(matches(isClickable())).perform(click());
try {
    Thread.sleep(delayedTime);
} catch (InterruptedException e) {
    e.printStackTrace();
}
onView(allOf(withId(R.id.button),withText("Open"))).check(matches(isClickable())).perform(click());
_

テストに合格することもあれば、合格しないこともあります。時々失敗する理由は"No views in hierarchy found matching: (with id: something:id/button and with text: is "Open").です。EspressoでThread.sleepを使用することも悪い習慣です。 Espressoのアイドリングリソース について読んだことがありますが、それは私には意味がなく、この特定の場合にそれをどのように適用できるかわかりません。

16
Great Question

実際、アイドリングリソースはエスプレッソの最も難しい点です。

テストで非同期のバックグラウンドタスクを待機/同期する必要がある場合は、これを実装する必要があります。デフォルトでは、Espressoは現在のメッセージキュー内のUI操作が処理され、デフォルトのAsyncTasks(デフォルトのAsyncTaskスレッドプールと同期)が完了するのを待ってから、次のテスト操作に進みます。 AsyncTasks についてこれを調べてください。ただし、たとえばWebサービスとの通信など、他のスレッドを開始する場合は、IdlingResourceを使用する必要があります。

必要になる可能性のあるThread.sleep()は、アイドリングリソースが必要になる可能性があることを示すシグナルです。

次に、アイドリングリソースの作成方法について説明します。コードの開発者は、この評価ポイントをどのように作成しているかを確認できるため、簡単に実行できます。

これは次のようなものになるはずです:

_public class DownloadIdlingResource extends BaseIdlingResource { ....}
_

このリソースがアイドル状態であるかどうかを定義することになっています。

このアイドリングリソースを待つ必要があることをEspressoに伝えたかったテストは、テストクラスの初期化中にこのアイドリングリソース(setUp()など)を定義するか、必要に応じてアクティブ化することになっています。それはあなたが待つ何かがあるが、それはまだ活性化されていないことを意味します。たとえば、ダウンロードのアイドリングリソースには、ダウンロードの開始時にアイドリングリソースを非アイドルに設定し(setIdle(false))、終了時にアイドルに戻すリスナーがあります(setIdle(true)) 。すべてのアイドリングリソースがアイドル状態の場合(終了するのを待つものがない場合)、Espressoは他のすべてのスタッフを継続します。アイドリングリソースの実装の詳細は、アプリケーションの実装に大きく依存します。

一般的なアイドリングリソースについて言えること:

1)isIdleNow()リソースがアイドル状態のときにロジックを実装する

2)registerIdleTransitionCallbackは、リソースが登録されるときにEspressoによって呼び出され、ResourceCallbackを提供します。

3)リソースがビジーからアイドルに移行すると、実際には、操作が終了した(マップデータがダウンロードされたか、ダウンロードがキャンセルされた)バックグラウンドタスクからコールバックを受け取ります。登録済みのcallonTransitionToIdle()を実行する必要があります。 ResourceCallback

4)getName()で、ロギングに使用されるリソースの名前を返す必要があります。

リソースのアイドリングのようなデッドロックが発生しないように注意してください。リソースのアイドリングにはタイムアウトがあります。アイドリングリソースの何が悪いのかを説明するメッセージによってテストが中断される可能性があります。

申し訳ありませんが、より具体的な例を書くことができませんが、それは実際にはアプリケーションの実装によって異なります。

39
Anna