12

問題: Espresso テストの実行中に問題が発生しました。ログイン ボタンで perform(click()) メソッドが呼び出された後、テストは実行され続けますが、45 秒経過するまで先に進まず、テストは自動的に失敗します。 . その間、ログインは正常に行われます。

コンテキスト: 2 つのフラグメントを並べたアクティビティがあります。右側のフラグメントは、ユーザー名とパスワードの EditText とログイン ボタンを処理します。このフラグメントは、子ビューとして ViewAnimator と 2 つの LinearLayouts で構築されます。最初の LinearLayout には前述の要素があり、2 番目の要素には他の要素があります。

これは、ログイン ボタンがクリックされたときに UI で発生することです。

    @Override
public void setUILoggingIn() {
    spinnerLogin.setVisibility(View.VISIBLE);
    loginButton.setEnabled(false);
    loginButton.setText(R.string.logging_in);
    usernameText.setEnabled(false);
    passwordText.setEnabled(false);
}

サーバーで認証した後、これが UI の処理方法です。

@Override
public void setUIAuthorized() {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            viewAnimator.showNext();
            // elements on the first child of the ViewAnimator
            loginButton.setEnabled(true);
            spinnerLogin.setVisibility(View.GONE);

            // elements on the second child of the ViewAnimator
            sendMessageButton.setEnabled(true); 
            chatInputText.setEnabled(true);
        }
    });
}

エスプレッソテスト

ViewInteraction loginButton2 = onView(withId(R.id.login_button));
        loginButton2.perform(click());        // Test gets stuck here.
        loginButton2.check(doesNotExist());   // Never reached.

この種のシナリオでテストを成功させるためにホットなことを知っている人はいますか? ViewAnimator がいつ変更されたかを検出するだけで十分ですが、クリック時にテストが停止します。

また、それはテストの始まりではありませんでした。前に示したコードの前に、このテストを実行すると、夢のように動作します。

ViewInteraction loginButton = onView(withId(R.id.login_button));

    /** Failed login **/

    loginButton.perform(click());

    ViewInteraction snackBarTextView = onView(
            allOf(withId(R.id.snackbar_text), withText("Login error"), isDisplayed()));
    snackBarTextView.check(matches(withText("Login error")));

皆様のご協力とアドバイスに感謝します

4

2 に答える 2

14

同様の問題がありましたが、私の場合は、表示されなかったフラグメントにロードされたプログレスバーでした。そのプログレスバーは誤って閉じられたのではなく、テストをブロックしていました。あなたが説明したように、45秒スタックした後にテストが失敗したという同じ結果が得られました。要約すると、UI スレッドでプログレスバーやその他のアニメーションが実行されていないことを確認してください。

于 2016-07-19T16:59:09.050 に答える
1

ListView を使用しているときに同じ問題が発生しました。

興味深いことに、手動で画面をスクロールしようとすると、テストが再開されることに気付きました。この行を追加すると問題が解決し、テストが再開されました。

onView(withId(R.id.myListView)).perform(swipeUp());

于 2016-07-20T09:19:23.203 に答える