强制检测活动以多窗口模式运行

时间:2017-04-14 12:53:04

标签: android testing android-espresso android-instrumentation

如您所知,android在android N中提供了Multi-Window support mode。我们的应用程序具有多窗口支持 但是如何测试呢?如何强制测试在该模式下运行应用程序?我没有在Instrumentation类或文档中的任何其他地方创建任何此类方法。也许用 Espresso 以某种方式可能吗?

2 个答案:

答案 0 :(得分:3)

来自 Launch New Activities in Multi-Window Mode

  

当您启动新活动时,如果可能,您可以向系统提示新活动应与当前活动相邻显示。为此,请使用意图标记 FLAG_ACTIVITY_LAUNCH_ADJACENT

来自Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT的文档:

  

此标志仅用于分屏多窗口模式。新活动将显示在启动它的旁边。这只能与 FLAG_ACTIVITY_NEW_TASK 一起使用。此外,如果您想要创建现有活动的新实例,则需要设置 FLAG_ACTIVITY_MULTIPLE_TASK

如图所示here如何启动受测试的活动:

@Configuration
public class ObjectMapperConfiguration {

    @Autowired
    public void configureObjectMapper(ObjectMapper mapper) {
        SimpleModule module = new SimpleModule()
                .addDeserializer(Account.class, new AccountDeserializer())
                .addDeserializer(Contact.class, new ContactDeserializer());

        mapper.registerModule(module);
    }
}

注意,这是基于文档的猜测,还没试过。虽然,在我看来你必须首先启动一个“假”活动,并从那里开始在多窗口模式下测试活动,因为“新活动将显示在< strong>启动它的那个“,所以应该有另一个活动用指定的@Test public void customIntentToStartActivity() { Intent intent = new Intent(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT) | Intent.FLAG_ACTIVITY_NEW_TASK); mActivity = mActivityRule.launchActivity(intent); } 标志启动它。

答案 1 :(得分:2)

不幸的是provided by azizbekian方式要求以前以多窗口模式加载的应用程序,所以我想提供自己的解决方案。在answer我找到了如何以编程方式进入多窗口模式。使用它我构建了完整的解决方案:

    UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
    //enter multi-window mode
    uiAutomation.performGlobalAction(AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN);
    //wait for completion, unfortunately waitForIdle doesn't applicable here
    Thread.sleep(1000);
    //simulate selection of our activity
    MotionEvent motionDown = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
            150, 200, 0);
    motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN);
    uiAutomation.injectInputEvent(motionDown, true);
    motionDown.recycle();
    MotionEvent motionUp = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_UP,
            150, 200, 0);
    motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN);
    uiAutomation.injectInputEvent(motionUp, true);
    motionUp.recycle();
    //perform test actions below

如您所见,有两种解决方法:

  1. 我们无法使用uiAutomation.waitForIdle等待进入多模式完成
  2. 我还没有找到在任务管理器中选择应用程序的方法,以请求关注我们的活动。所以我只是对我们活动的可能位置进行一些触摸事件。
  3. 实施后,您将能够像往常一样使用Espresso等测试活动。