Android-эспрессо и подборщик аккаунтов

У меня возникают проблемы при проведении контрольно-измерительных работ с использованием эспрессо. У меня есть действие, когда при запуске приложения появляется всплывающее окно выбора учетной записи (основное действие). Если клиент нажимает кнопку "Отмена" (в диалоговом окне), всплывающее окно снова появляется; Если пользователь нажимает кнопку "Добавить", результат выбирается по результату активности.

Я не знаю, как создать простой тест с эспрессо, который будет включать в себя этот сборщик. Когда я создавал инструментальный тест с MainActivity, я получил это сообщение: никаких действий на этапе 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()));
    }
}

У кого-нибудь была подобная проблема?

Спасибо за ваши ответы заранее.

3 ответа

Это сложный вопрос:). Проблема в том, что, как только поток покидает ваше приложение (Google Account Picker является внешним приложением), Espresso заканчивает тестирование. Выбор аккаунта - это действие из пакета com.google.android.gmsТаким образом, внешний. Как только он начнется, ваш тест закончится, и вы никогда не сможете ничего сопоставить в диалоговом окне.

У вас есть три возможных решения, чтобы сделать ваши тесты выполнимыми:

  • Использование подстановки classpath в вашем приложении для фальсификации намерений; или же
  • Исправление "тестируемости" вашего приложения; или же
  • Используя внедрение зависимости, как Dagger

Я покажу, как использовать подстановку classpath. Техника очень проста: вы должны изолировать создание 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) пакет с тем же именем и методами, но который возвращает другое намерение, поддельное / фиктивное:

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

Каждый раз, когда выполняются ваши тесты, они будут использовать "ближайший" класс в classpath, то есть IntentsFactory из ваших тестов. Вместо того, чтобы возвращать намерение, которое отправляет поток в другое приложение, поток переходит к классу вашего проекта, и Espresso не заканчивает тесты.

Единственное предостережение здесь заключается в том, что вам придется создать MyDummyAccountPickerActivity который вернет результат и Bundle похож на тот, который возвращается классом фреймворка. Активность должна существовать в манифесте вашего приложения, и вам нужно будет указать среде выполнения вашего эмулятора Dalvik разрешить замену classpath (проверьте это, эта и эта ссылки) следующей командной строкой:

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

И выполнить ваши тесты.

У меня была похожая проблема при тестировании камеры, и она подробно обсуждается на форуме эспрессо.

Похоже, что вы должны работать в корневом представлении, которое в вашем случае "сборщик учетных записей". Попробуйте это:

public void testAccountPicker(){
    onView(withText("Choose an account"))
        .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
        .check(matches(isDisplayed()));
}

Есть несколько способов проверить это с помощью Espresso Intents https://google.github.io/android-testing-support-library/docs/espresso/intents/

Вы можете убедиться, что Намерение было отправлено, чтобы открыть средство выбора учетной записи, используя синтаксис предназначенный (). Вы также можете проверить поведение вашей деятельности с помощью возвращенного результата из средства выбора, используя синтаксис intending(). ResponseWith().

Если вы действительно хотите взаимодействовать со сборщиком напрямую, вы можете использовать API UIAutomator: https://developer.android.com/topic/libraries/testing-support-library/index.html

UIAumator может использоваться внутри тестов эспрессо.

Другие вопросы по тегам