在ViewAnimator中点击按钮后,Espresso测试无法运行/停止。

13

问题: 我在运行Espresso测试时遇到了一个问题,当调用login按钮上的perform(click())方法后,测试会持续运行,但在45秒后自动失败,而登录则正常进行。

背景:我有一个Activity,在右侧有两个Fragment并排显示,右侧的Fragment处理用户名和密码EditText以及登录按钮。该Fragment使用ViewAnimator构建,并作为两个LinearLayout的子视图,第一个LinearLayout包含前述元素,第二个LinearLayout包含其他内容。

这就是当点击登录按钮时UI上发生的情况:

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

在与服务器进行身份验证后,这是我处理用户界面的方式:

@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);
        }
    });
}

Espresso测试

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")));

感谢大家的帮助和任何建议

2个回答

16

我曾经遇到过相似的问题,我的情况是在一个未显示的片段上加载了进度条,这个进度条由于错误没有被解除,导致测试被阻塞。我和你描述的情况一样,在45秒后测试失败。

总之,请检查是否有在UI线程上运行的动画,例如进度条或其他任何动画。


感谢您的回答@jeprubio。我尝试从视图中删除循环进度条,但问题仍然存在。我还尝试使用Idling Resources,但无法使其正常工作。还有其他想法吗? - Alejandro H. Cruz
我解决了!TextView 中还有另一个动画。再次感谢您的帮助。 - Alejandro H. Cruz

1
我在使用 ListView 时遇到了同样的问题。有趣的是,我发现如果手动滚动屏幕,测试将会继续进行。添加这一行代码解决了问题并恢复了测试。

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


1
最新的Espresso仍然存在同样的问题,就像你描述的那样,swipeUp()确实有助于解除阻塞执行。不幸的是,后来我发现,如果使用swipeUp(),接下来的atPosition().perform(click())可能会随机失败,即使它没有抛出任何异常,它也会默默地失败。 - Radim Blazek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接