android.support.test.espresso.NoActivityResumedException:阶段RESUMED中没有活动

时间:2016-02-15 21:54:56

标签: android android-espresso android-instrumentation

我正在尝试为我的活动编写测试用例。我有几个活动,当我尝试在其他ActivityTest类上运行测试时遇到以下错误时,其中一个活动没有问题。

  

android.support.test.espresso.NoActivityResumedException:没有   阶段活动已恢复。你忘了发动这项活动吗?   (test.getActivity()或类似的)?

这是我的课,我的所有测试用例都失败了:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class LocatingActivityTest
{
    @Rule
    public ActivityTestRule<LocatingActivity> mActivityTestRule = new ActivityTestRule<>(LocatingActivity.class);

    private LocatingActivity mLocatingActivity;

    @Before
    public void setup()
    {
        mLocatingActivity = mActivityTestRule.getActivity();
    }

    @Test
    public void viewsMustBeVisible()
    {
        onView(withId(R.id.locating_text)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.sonarView)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.locating_cancel_booking)).check(matches(isCompletelyDisplayed()));

        onView(withId(R.id.locating_list_view)).check(matches(isDisplayed()));
    }

    @Test
    public void viewsMustBeEnabled()
    {
        onView(withId(R.id.tvNoDriverFound)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.tvNextSearch)).check(matches(not(isCompletelyDisplayed())));
    }
}

然而,这是我所有测试用例通过的另一个类:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class BookingActivityTest
{
    @Rule
    public IntentsTestRule<BookingTaxiActivity> mActivityTestRule = new IntentsTestRule<>(BookingTaxiActivity.class);

    private BookingTaxiActivity mBookingTaxiActivity;

    @Before
    public void setup()
    {
        mBookingTaxiActivity = mActivityTestRule.getActivity();
    }

    @Test
    public void viewsMustBeVisible()
    {
        onView(withId(R.id.booking_pick_up_layout)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.booking_drop_off_layout)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.fab_booking)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.booking_estimated_fare)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.ibMenu)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.booking_toolbar)).check(matches(isCompletelyDisplayed()));

        onView(withId(R.id.booking_taxi_type_picker)).check(matches(isDisplayed()));
    }

    @Test
    public void viewsMustBeEnabled()
    {
        // These Views are off the screen
        onView(withId(R.id.tag_widget)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.payment_btn)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.current_pickup_view)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.advance_pickup_view)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.booking_notes_btn)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.promo_code_btn)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.taxi_warning)).check(matches(not(isCompletelyDisplayed())));
        onView(withId(R.id.booking_book_now)).check(matches(not(isCompletelyDisplayed())));
    }
}

我不知道为什么上面的类的测试会在其他类失败时传递。

5 个答案:

答案 0 :(得分:6)

好的,我刚发现一个令人痛苦的事实,即Espresso无法从快乐路径的某个地方运行活动。

让我们说我的快乐路径包含活动A,B和C.我以为我能够在不调用活动A的情况下运行活动B(或C)的测试。所以这是不可能的,并导致上述错误。您应该做的是单击活动A上的按钮,活动B显示,这样您就可以执行测试,然后单击调用活动C并执行测试的按钮(或转到下一个活动的逻辑)

这太痛苦了:( 特别是我花了一个星期才实现它的事实。文档不能清楚地说出来吗?!!!

答案 1 :(得分:3)

如果运行设备处于锁定模式,和/或活动处于非活动状态,则会触发此错误。确保您的设备已开启且app / test能够在前台运行! 有史以来最简单的修复(至少对我而言)!

答案 2 :(得分:0)

我有时会在Jenkins服务器上收到这些错误。两个选项:

  1. 通常重新触发构建会传递这些内容。尝试运行此测试几次,并检查它们是否通过。

  2. 使用UI automator打开屏幕。 Espresso test fails with NoActivityResumedException often

答案 3 :(得分:0)

如果在设备上进行Espresso测试时发生此问题,则可以在要测试的活动的onCreate中添加以下代码。这将在执行测试时保持屏幕开启

    if(BuildConfig.DEBUG){
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

答案 4 :(得分:0)

并行运行Espresso测试可能是一个问题。如果在多次运行时测试失败,但在单独运行时没有失败,则可能的原因是并行执行测试。

尝试在命令末尾添加--no-parallel。 使用--no-parallel。

示例-> gradlew connectedLiveDebugAndroidTest --no-parallel

在同一设备上同时运行的两个不同的Espresso测试使它们不稳定并且容易失败。