TestUI (Дженкинс) с использованием эспрессо
Приложение проходит тесты эспрессо локально, я имею в виду прямо к устройствам и эмуляторам genymotion. Когда я использую Jenkins для создания изображения приложения. Тест эспрессо не увенчался успехом. Я получаю эту ошибку.
Дженкинс
java.lang.RuntimeException: Waited for the root of the view hierarchy to have window focus and not be requesting layout for over 10 seconds. If you specified a non default root matcher, it may be picking a root that never takes focus. Otherwise, something is seriously wrong. Selected Root:
Root{[email protected], [email protected], has-window-focus=false, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) sim=#100 ty=1 fl=#1810100 pfl=0x8 wanim=0x103028f}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=800, height=1184, has-focus=true, has-focusable=true, has-window-focus=false, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}}
. All Roots:
Root{[email protected], [email protected], has-window-focus=false, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) sim=#100 ty=1 fl=#1810100 pfl=0x8 wanim=0x103028f}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=800, height=1184, has-focus=true, has-focusable=true, has-window-focus=false, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}}
at com.google.android.apps.common.testing.ui.espresso.base.RootViewPicker.get(RootViewPicker.java:84)
at com.google.android.apps.common.testing.ui.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:51)
at com.google.android.apps.common.testing.ui.espresso.ViewInteractionModule$$ModuleAdapter$ProvideRootViewProvidesAdapter.get(ViewInteractionModule$$ModuleAdapter.java:187)
at com.google.android.apps.common.testing.ui.espresso.ViewInteractionModule$$ModuleAdapter$ProvideRootViewProvidesAdapter.get(ViewInteractionModule$$ModuleAdapter.java:151)
at com.google.android.apps.common.testing.ui.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:52)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction$2.run(ViewInteraction.java:141)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Ответы
Ответ 1
Stacktrace означает, что Espresso не может найти окно приложения. Во время тестирования на экране эмуляторов обычно скрывается за блокировкой экрана. Вам нужно использовать некоторый код, чтобы программно отключить ScreenLock.
Самый удобный способ разблокировки экрана - использовать Robotium. У него есть метод solo.unlockScreen(). Я поместил его в метод setUp() тестирования жизненного цикла.
Ссылки:
https://github.com/RobotiumTech/robotium/blob/master/robotium-solo/src/main/java/com/robotium/solo/Solo.java
Ответ 2
Решение состоит в том, чтобы создать пользовательский тестовый бегун, чтобы разблокировать экран и запустить блокировку слежения до тех пор, пока не будут выполнены тесты.
public class TestRunner extends android.support.test.runner.AndroidJUnitRunner
{
private PowerManager.WakeLock mWakeLock;
@Override
public void callApplicationOnCreate(Application app)
{
// Unlock the screen
KeyguardManager keyguard = (KeyguardManager) app.getSystemService(Context.KEYGUARD_SERVICE);
keyguard.newKeyguardLock(getClass().getSimpleName()).disableKeyguard();
// Start a wake lock
PowerManager power = (PowerManager) app.getSystemService(Context.POWER_SERVICE);
mWakeLock = power.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, getClass().getSimpleName());
mWakeLock.acquire();
super.callApplicationOnCreate(app);
}
@Override
public void onDestroy()
{
mWakeLock.release();
super.onDestroy();
}
}
Затем AndroidManifest.xml
ваших тестов и добавьте необходимые разрешения:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Не забудьте изменить свой build.gradle
, чтобы использовать новый класс testInstrumentationRunner
.
Источник
Ответ 3
С моей точки зрения, вам нужно организовать свою работу Jenkins следующим образом: перед запуском тестов Espresso (я полагаю, вы подключилиAndroidTest в ), там что-то вроде этого), добавьте сообщение -build, чтобы удалить пакет приложения, а другой - удалить тестовый пакет приложения. Пример: com.example.mypackage.debug и com.example.mypackage.debug.test. Это хороший способ обновить приложение в вашем смартфоне/эмуляторе, чтобы Espresso использовал свою магию.
Также убедитесь, что у вас включена опция "Всегда включено" в Инструментах разработчика (в зависимости от устройства, в разделе "Настройки" есть параметры разработчика или подменю "Инструменты разработчика" ).
Если это не работает, это означает, что где-то в вашей работе Jenkins у вас есть какой-то порядок действий и нужно уточнить. Для меня удаление пакетов помогло мне очистить систему от всех вещей, связанных с моим приложением.
Надеюсь, это сработает и для вас.
Если нет, напишите комментарий, и я помогу вам.
Удачи!
Ответ 4
Я предлагаю использовать Test-Butler, чтобы отключить отображение анимации и разблокировки во время тестирования.