В рамках нового приложения для Android мы создаем полную непрерывную интеграцию (с Jenkins, но это не имеет значения).Действительно ли обезьяна имеет смысл?
На данный момент мы автоматизировали тесты JUnits и UI, и мы думали о добавлении тестирования Monkey после каждой сборки, как дополнительный шаг качества.
Однако наши отзывы об Обезьяне пока весьма отрицательные. Мы создали свежее новое, пустым Android-приложение (основное приложение Hello World при создании пустого проекта в Android Studio), и даже тогда тест Monkey регулярно вылетает (работает на эмуляторе), поскольку, по-видимому, не имеет отношения к наше приложение.
Команда, которую я попробовал:
adb shell monkey -v -v -s -2972043913753481246 -p my.app.package 50000
Но он выходит из строя по пути (около шаг 6000).
Я думал, что это может быть связано с эмулятором будучи чрезмерно запрошены, поэтому я добавил некоторые дросселирования, чтобы эмулятор дышать:
adb shell monkey -v -v -s -2972043913753481246 --throttle 150 -p my.app.package 50000
Но все-таки, он выходит из строя (далее вокруг шага 8000).
Я подумал, что, может быть, нужно еще больше дышать, поэтому я ставлю 1 секунду дросселирования просто чтобы убедиться (даже люди могут действовать быстрее, чем это)
adb shell monkey -v -v -s -2972043913753481246 --throttle 1000 -p my.app.package 50000
И все же, он выходит из строя (около этапе 48 000).
Добавление --ignore-native-crashes
ничего не изменило.
Итак, вся моя задача: действительно ли обезьяна имеет смысл? Это не похоже на актуальность (если пустое приложение Hello World, предоставленное самой Android Studio, является основной причиной, то я не хочу видеть, что произойдет с реальным приложением).
Кто-нибудь нашел способ сделать тестирование обезьян стабильным и уместным? Какую конфигурацию (количество событий, дросселирование, дополнительные флаги) вы используете?
Одна из аварий, которые я получаю с 150 мс дросселирования:
// CRASH: com.android.launcher (ИДП 1838) // Short Msg: java.lang.IllegalArgumentException // Long Msg: java.lang.IllegalArgumentException: ширина и высота должна быть> 0 // Сложение Label: generic_x86/sdk_google_phone_x86/generic_x86: 5,1/LKY45/1737576: Eng/тест-ключи // Строит список изменений: 1737576 // Время постройки: 1423932217000 // java.lang.IllegalArgumentException: ширина и высота должны быть> 0 // at android.graphics.Bitmap.createB itmap (Bitmap.java:810) // в android.graphics.Bitmap.createBitmap (Bitmap.java:789) // в android.graphics.Bitmap.createBitmap (Bitmap.java:756) // в com. android.launcher2.Cling.dispatchDraw (Cling.java:201) // в android.view.View.updateDisplayListIfDirty (View.java:14162) // в android.view.View.getDisplayList (View.java:14189) // at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:3389) // at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:3368) // на android.view.View.updateDisplayListIfDirty (View.java:14127) // на android.view.View.buildLayer (View.java:13979) // на com. android.launcher2.AppsCustomizeTabHost.enableAndBuildHardwareLayer (AppsCustomizeTabHost.java:359) // в com.android.launcher2.AppsCustomizeTabHost.onLauncherTransitionStart (AppsCustomizeTabHost.java:403) // в com.android.launcher2.Launcher.dispatchOnLauncherTransitionStart (Launcher.java:2538) // в com.android.launcher2.Launcher.hideAppsCustomizeHelper (Launcher.java:2852) // в com.android.launcher2.Launcher.showWorkspace (Launcher.java:2900) // at com.android.launcher2.Launcher.showWorkspace (Launcher.java:2893) // at com.android.launcher2.Launcher.startSearch (Launcher.java:1642) // at com.android.launcher2.Launcher .onSearchRequested (Launcher.java:1766) // at com.android.launcher2.Launcher.onKeyDown (Launcher.java:891) // at android.view.KeyEvent.dispatch (KeyEvent.java:2619) // at android.app.Activity.dispatchKeyEvent (Activity.java:2707) // в com.android.launcher2.Launcher.dispatchKeyEvent (Launcher.java:1973) // в com.android.internal.policy.impl. PhoneWindow $ DecorView.dispatchKeyEvent (PhoneWindow.java:2276) // at android.view.ViewRootImpl $ ViewPostImeInputStage.processKey Событие (ViewRootImpl.java:4020) // в android.view.ViewRootImpl $ ViewPostImeInputStage.onProcess (ViewRootImpl.java:3982) // в android.view.ViewRootImpl $ InputStage.deliver (ViewRootImpl.java:3544) // в android.view.ViewRootImpl $ InputStage.onDeliverToNext (ViewRootImpl.java:3597) // в android.view.ViewRootImpl $ InputStage.forward (ViewRootImpl.java:3563) // в android.view .ViewRootImpl $ AsyncInputStage.forward (ViewRootImpl.java:3680) // в android.view.ViewRootImpl $ InputStage.apply (ViewRootImpl.java:3571) // в android.view.ViewRootImpl $ AsyncInputStage .Не (ViewRootImpl.java:3737) // в android.view.ViewRootImpl $ InputStage.deliver (ViewRootImpl.java:3544) // в android.view.ViewRootImpl $ InputStage.onDeliverToNext (ViewRootImpl.java:3597) // в android.view.ViewRootImpl $ InputStage.forward (ViewRootImpl.java:3563) // в android.view.ViewRootImpl $ InputStage.apply (ViewRootImpl.java:3571) // в андроида. view.ViewRootImpl $ InputStage.deliver (ViewRootImpl.java:3544) // в android.view.ViewRootImpl $ InputStage.onDeliverToNext (ViewRootImpl.java:3597) // в android.view.ViewRootImpl $ InputStage.forward (Viewr ootImpl.java:3563) // в android.view.ViewRootImpl $ AsyncInputStage.forward (ViewRootImpl.java:3713) // в android.view.ViewRootImpl $ ImeInputStage.onFinishedInputEvent (ViewRootImpl.java:3874) // в android.view.inputmethod.InputMethodManager $ PendingEvent.run (InputMethodManager.java:2208) // в android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback (InputMethodManager.java:1849) // в android.view .Inputmethod.InputMethodManager.finishedInputEvent (InputMethodManager.java:1840) // at android.view.inputmethod.InputMethodManager $ ImeInputEventSender.onInputEventFinished (InputMethodManager.Java: 2185) // в android.view.InputEventSender.dispatchInputEventFinished (InputEventSender.java:141) // в android.os.MessageQueue.nativePollOnce (Native Method) // в android.os.MessageQueue.next (MessageQueue.java:143) // на android.os.Looper.loop (Looper.java:122) // на android.app.ActivityThread.main (ActivityThread.java:5257) // на java.lang. reflect.Method.invoke (собственный метод) // в java.lang.reflect.Method.invoke (Method.java:372) // в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 903) // at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698) //
Крушение, которое я получаю с регулированием 1000 мс, - это путь к огромным (десятки тысяч строк), чтобы отправлять сообщения на СО, я боюсь.
Обезьяна актуальна, потому что она вызывает худший случай непредсказуемого характера пользователя и гарантирует его не сбой. И без того, что крушение ... трудно сказать. – JoxTraex
Я добавил крушение, которое я получаю с регулированием 150 мс. – jdebon
Я бы предпочел, чтобы я сделал свое испытание, а не обезьяну, но это только я;) – Smashing