2015-08-27 2 views
1

В рамках нового приложения для 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 мс, - это путь к огромным (десятки тысяч строк), чтобы отправлять сообщения на СО, я боюсь.

+0

Обезьяна актуальна, потому что она вызывает худший случай непредсказуемого характера пользователя и гарантирует его не сбой. И без того, что крушение ... трудно сказать. – JoxTraex

+0

Я добавил крушение, которое я получаю с регулированием 150 мс. – jdebon

+0

Я бы предпочел, чтобы я сделал свое испытание, а не обезьяну, но это только я;) – Smashing

ответ

0

Интересная вещь - обезьяна непредсказуема, вы никогда не знаете, что будет дальше. Обезьяна выполняет случайные события, если повезет, она может инициировать все события без какого-либо ордера, а затем отображать скрытые, неожиданные исключения или эффекты в приложении.

+0

Я не уверен, что это отвечает на мой вопрос. Я спрашиваю, имеет ли смысл обезьяна, потому что она не является стабильной вообще, и приносит много сбоев, которые вообще не связаны с нашим приложением ... – jdebon

+0

Обезьяна может быть ограничена в вашем приложении, поэтому вы можете фильтровать, какие наличные деньги с вашими only.Sometimes несколько продолжающихся событий могут также вызвать сбой – Lemon

+0

Как вы знаете, обезьяна ограничена, я просто использую ее для проведения некоторых предварительных тестов – Lemon

0

Я считаю, что ответ ДА ​​на вопрос «это испытание обезьяны значащее». Как вы уже упоминали, проблема может быть связана с ошибкой эмулятора. И я полагаю, что ваша команда проверки обезьяны ограничена в вашем приложении, и все настройки в порядке.

И выпрыгните из этой ошибки, вы можете увидеть, что тест обезьяны - это своего рода стресс-тест. Он может идентифицировать некоторые ошибки из коробки. И есть некоторые причины, я беру из вики:

  • Характеристическая хаотичность тестирования обезьяны также делает его хорошим способом найти основные ошибки, которые могут нарушить всю систему.
  • Интеллектуальные обезьяны, если они правильно настроены с использованием точной модели состояния, могут быть действительно полезны при поиске различных типов ошибок.

Необходимо проверить обезьяну как часть тестирования программного обеспечения. И если вы хотите, чтобы ваша обезьяна стала «умной». Вы можете использовать monkeyrunner, предоставленный Google, чтобы указать какое-либо событие и вручную протестировать часть вашего приложения. Monkeyrunner может быть немного стабильным и релевантным. Вот некоторые tips and tricks, которые я использовал в тесте Android обезьяны.