6

我正在尝试测试两个不同的Activity类,其中一个Activity恰好调用另一个。这是我的代码,然后我将解释问题:

介绍活动测试

public class IntroActivityTest extends ActivityInstrumentationTestCase2<IntroActivity> {

    IntroActivity activity;

    public IntroActivityTest() {

        super( IntroActivity.class );
    }

    @Override
    protected void setUp() throws Exception {

        super.setUp();
        activity = getActivity();
    }

    public void testIntroBypass() {

        if ( new SharedPreferencesHelper( getInstrumentation().getTargetContext() ).retrieveUserToken() == null ) {
            assertTrue( !activity.isFinishing() );
        }
        else {
            assertTrue( activity.isFinishing() );
        }
    }
}

根活动测试:

public class RootActivityTest extends ActivityInstrumentationTestCase2<RootActivity> {

    RootActivity activity;

    public RootActivityTest() {

        super( RootActivity.class );
    }

    @Override
    protected void setUp() throws Exception {

        super.setUp();
        activity = getActivity();
    }

    public void testInitialTab() {

        assertTrue( activity.getSupportActionBar().getSelectedTab().getText().toString().equalsIgnoreCase( "Library" ) );
    }
}

IntroActivityTest中,如果来自的用户令牌SharedPreferences不为空,则立即开始RootActivity。如果它为空,它会保持在IntroActivity. 问题是,如果它不为空,则第一个测试 ( IntroActivityTest) 通过,然后它挂在getActivity()方法调用上RootActivityTest,测试只是冻结...没有异常,它只是挂在该行上。如果用户令牌为空,它会完全正常运行这两个测试。

这可能是什么原因造成的?从观察来看,似乎RootActivityTest正在尝试使用RootActivity从 开始的IntroActivity,但它不应该开始自己的实例RootActivity吗?

4

2 回答 2

7

根据ActivityInstrumentationTestCase2 API

此类提供单个活动的功能测试。被测活动将使用系统基础设施创建(通过调用 InstrumentationTestCase.launchActivity()),然后您将能够直接操作您的活动。

每个 ActivityInstrumentationTestCase2 实现都是完全隔离的,并且有自己的生命周期,不依赖于其他 ActivityInstrumentationTestCase2 实现。可测试的活动必须始终通过仪器基础设施创建,而不是来自被测应用程序本身。在您的情况下,RootActivityTest 不会从应用程序中获取由 IntroActivity 启动的 RootActivity,并且不会针对 RootActivity 持续运行测试。如果有一个 RootActivity 不知从何而来(不是由 InstrumentationTestRunner 带来的)并被带到前面,在运行 RootActivityTest 时,InstrumentationTestRunner 在尝试创建可测试的 RootActivity 时会感到困惑,并且只是停止并等待这个陌生人被杀死。

为了测试你想要的,即如果来自 SharedPreferences 的用户令牌是非空的,它会立即启动 RootActivity。如果它为空,则保留在 IntroActivity 上,您可以在 IntroActivityTest 中编写所有内容并使用Instrumentation.ActivityMonitor检测从 IntroActivity 启动的 RootActivity。在这里查看代码示例。请注意,您需要在 IntroActivityTest 中完成测试后完成 RootActivity,以便在 RootActivityTest 中调用 getActivity() 时 RootActivity 可以正常启动。

使用 RootActivityTest 测试所有与 RootActivity 相关的东西,在它启动并被带到前面之后,例如,TextView 渲染得很好,按钮点击做正确的事情等等。在 RootActivityTest 中,你不需要关心 RootActivity 是在哪里以及如何启动的,只需调用 getActivity() 并要求检测可测试的 RootActivity。

于 2012-08-02T21:55:08.433 回答
0

当以前的测试没有关闭活动时,我遇到了同样的问题,而新的测试开始时也有同样的意图。但是操作系统 Android 看到活动已经开始并且没有什么,所以InstrumentationTestCase开始等待已经被 tsarted 的活动

于 2016-05-06T09:41:31.600 回答