7

我无法使用 Espresso 进行仪器测试。我有一个活动,当应用程序启动时会弹出帐户选择器(主要活动)。如果客户点击取消(在对话框中),选择器会再次弹出;如果用户单击添加,则在活动结果中获取结果。

我不知道如何使用 espresso 创建一个包含该选择器的简单测试。当我使用 MainActivity 创建 Instrumentation 测试时,我收到了这条消息: RESUMED 阶段没有活动...

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>{
    MainActivity myActivity;
    public MainActivityTest(){
        super(MainActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        getActivity();
    }

    public void testAccountPicker(){
        onView(withText("Choose an account")).check(matches(isDisplayed()));
    }
}

有没有人有类似的问题?

提前感谢您的回答。

4

3 回答 3

3

这是一个艰难的:)。这里的问题是,一旦流程离开您的应用程序(Google Account Picker 是一个外部应用程序),Espresso 就会结束测试。Account Picker 是包中的一个活动com.google.android.gms,因此是外部的。一旦开始,您的测试就完成了,您将永远无法匹配对话框中的任何内容。

您有三种可能的解决方案来使您的测试可行:

  • 在您的应用程序上使用类路径替换来伪造意图;或者
  • 修复您的应用程序“可测试性”;或者
  • 使用依赖注入,例如Dagger

我将展示如何使用类路径替换。该技术非常简单:您应该将 Intent 创建隔离在一个单独的类中,例如IntentsFactory,在测试期间覆盖该类。

假设你的工厂在com.yourapp.factories.IntentsFactory里面,它是这样的:

public class IntentsFactory {
    public static Intent getAccountPickerIntent (Context context) {
        return AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
    }
}

您应该在您的测试应用程序中创建(比如说它是com.yourapp.tests)一个具有相同名称和方法的包,但它返回一个不同的 Intent,一个模拟/虚拟的:

public class IntentsFactory {
    public static Intent getAccountPickerIntent (Context context) {
        return new Intent(context, MyDummyAccountPickerActivity.class);
    }
}

每当您的测试执行时,它们将使用类路径中“最近的”类,即测试中的 IntentsFactory。与其返回将流程发送到另一个应用程序的意图,流程将转到您项目的一个类,并且 Espresso 不会结束测试。

这里唯一需要注意的是,您必须创建MyDummyAccountPickerActivity将返回一个结果并且Bundle与框架类返回的结果类似的结果。该活动应该存在于您的应用程序的清单中,并且您必须指示您的模拟器 Dalvik 运行时允许使用以下命令行替换类路径(查看thisthis链接):

adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd

并执行您的测试。

我在测试相机时遇到了类似的问题,并在 Espresso 论坛中进行了深入讨论

于 2014-02-18T12:08:26.150 回答
1

似乎,您必须在根视图上操作,在您的情况下是“帐户选择器”。试试这个:

public void testAccountPicker(){
    onView(withText("Choose an account"))
        .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
        .check(matches(isDisplayed()));
}
于 2014-02-12T07:43:27.147 回答
0

您可以通过多种方式使用 Espresso Intents 进行测试https://google.github.io/android-testing-support-library/docs/espresso/intents/

您可以使用 expected() 语法验证是否已发送 Intent 以打开帐户选择器。您还可以使用 Intenting().respondWith() 语法通过选择器返回的结果来验证活动的行为。

如果您真的想直接与选择器交互,您可以使用 UIAutomator API:https ://developer.android.com/topic/libraries/testing-support-library/index.html#UIAutomator

UIAutomator 可以在 Espresso 测试中使用。

于 2017-05-26T17:35:50.800 回答