问题标签 [monkey]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 猴子真的有意义吗?
作为新的 Android 应用程序的一部分,我们正在建立一个完整的持续集成(使用 Jenkins,但没关系)。
到目前为止,我们已经自动化了 JUnit 和 UI 测试,并且我们正在考虑在每次构建之后添加 Monkey 测试,作为额外的质量步骤。
然而,到目前为止,我们对 Monkey 的反馈相当负面。我们创建了一个全新的空 Android 应用程序(当您在 Android Studio 中创建一个空项目时的基本 Hello World 应用程序),即便如此,Monkey 测试也会经常崩溃(在模拟器上运行),因为这似乎与我们的应用程序。
我试过的命令:
但它一路崩溃(大约步骤 6000)。
我认为这可能是由于模拟器被过度请求,所以我添加了一些限制让模拟器呼吸:
但是,它仍然崩溃(进一步,在步骤 8000 附近)。
我认为它可能需要更多的呼吸,所以我设置了 1 秒的节流以确保(即使是人类也可以更快地行动)
而且,它仍然崩溃(大约 48 000 步)。
添加--ignore-native-crashes
并没有改变任何东西。
所以我的全部观点是:猴子真的有意义吗?它似乎不相关(如果 Android Studio 本身提供的一个空的 Hello World 应用程序是根本原因,那么我不想看到现实世界的应用程序会发生什么)。
有人找到一种方法让 Monkey 测试稳定且相关吗?您使用什么配置(事件数、限制、附加标志)?
我在 150 毫秒限制时遇到的崩溃之一:
// 崩溃:com.android.launcher (pid 1838) // 短消息:java.lang.IllegalArgumentException // 长消息:java.lang.IllegalArgumentException:宽度和高度必须 > 0 // 构建标签:generic_x86/sdk_google_phone_x86/ generic_x86:5.1/LKY45/1737576:eng/test-keys // Build Changelist: 1737576 // Build Time: 1423932217000 // java.lang.IllegalArgumentException: width and height must be > 0 // at android.graphics.Bitmap.createBitmap (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) // 在 android.view .ViewGroup。recreateChildDisplayList(ViewGroup.java:3389) // 在 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) // 在 com.android.launcher2.Launcher.showWorkspace(Launcher.java:2893) // 在 com.android.launcher2.Launcher。startSearch(Launcher.java:1642) // 在 com.android.launcher2.Launcher.onSearchRequested(Launcher.java:1766) // 在 com.android.launcher2.Launcher.onKeyDown(Launcher.java:891) // 在 android .view.KeyEvent.dispatch(KeyEvent.java:2619) // 在 android.app.Activity.dispatchKeyEvent(Activity.java:2707) // 在 com.android.launcher2.Launcher.dispatchKeyEvent(Launcher.java:1973) / / at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2276) // at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4020) // at 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.apply(ViewRootImpl.java:3737) // 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) / / at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597) // at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563) // at android.view.ViewRootImpl$InputStage.apply( ViewRootImpl.java:3571) // 在 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: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) / / at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1840) // at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2185) // at 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(Native Method) // 在 java.lang.reflect.Method.invoke(Method.java:372) // 在 com.android。 internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) // 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) //android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) // 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) //android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) // 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) //
我担心在 1000 毫秒的节流中发生的崩溃是巨大的(数万行)发布在 SO 上的方式。
android - 带有自动重启猴子测试的 Android Jenkins CI
我有一个未使用的 mac mini,所以我在上面安装了 Jenkins,我正在尝试对其进行配置,以便它始终在我们最新的 Android 版本上运行猴子测试。我找不到办法做到这一点。我发现Android Emulator Plugin允许启动模拟器,然后在构建上运行 Monkey Test,但它似乎只能针对一定数量的事件进行配置,而不是基于时间的。
理想的 Jenkins 配置将轮询 git 服务器。当它在特定分支上看到新的提交时,它会构建 APK,运行模拟器,然后开始猴子测试。我确信会发生崩溃,每次发生崩溃时测试都应该重新开始。它应该无限期地继续这样运行。然后,当检测到新的提交时,它将关闭模拟器,并重新开始构建。
是否有任何创造性的方式可以将 Jenkins 构建配置为持续运行猴子测试?
android - 在我手机的 Android>data 文件夹中看不到我的应用程序包
我正在使用 Android Studio,当我在其上运行时,我无法在设备的Android>Data文件夹中看到我的包apk
。没有它我无法运行猴子。我也在installLocation="auto"
清单中提到并给予WRITE_EXTERNAL_STORAGE
许可仍然看不到我的包名。
android - Monkey test会不会偶尔进入设置,点击重启按钮重启设备?
在 android 设备上进行 Monkey 测试时,我发送
然后 Monkey 会向设备发送很多随机事件,我可以看到很多滑动屏幕或单击按钮。Monkey 会不会偶尔进入设置,点击重启按钮重启设备?因为我发现运行一段时间后,设备会自行重启。我可以自己避免猴子测试单击重新启动按钮吗?谢谢。
android - 杀死android进程时如何保证生成墓碑文件
我必须模拟现有的android进程将被杀死并因此立即生成墓碑文件的情况。
我使用以下命令序列来实现这一点:
不幸的是,“-6”信号(以及任何其他可能的信号)并不能保证会生成墓碑这一事实。
关于如何在不修改应用程序的情况下保证生成墓碑的任何想法?
谢谢!
android - 使用 Monkey Test 时如何防止输入设置
我在 android 设备(LG G4)中对我的应用程序进行了猴子测试。
命令是
adb shell monkey -p {package name} -v 2000
但它可能会意外进入设置并更改我设备的默认值。
如何预防?
monkeyrunner - 运行 monkey_recorder.py 错误:不匹配的输入 'monkey_recorder' 期待 NEWLINE
当我尝试使用 monkeyrunner 命令运行记录器时,出现错误:不匹配的输入 'monkey_recorder' 需要换行。这是我的命令的屏幕截图。 在此处输入图像描述
android - Android:猴子在设置活动上花费不成比例的事件
我是在 Android 上使用猴子的新手,通过尝试一些示例,我发现它的大部分事件都用于设置活动。我从哪个活动开始测试并不重要,它最终只是试图更改我的设置活动。
有没有办法可以强迫猴子避免这样做并以有意义的方式使用它?
java - 猴子测试 java.io.filenotfoundexception
如何知道在我的代码中抛出的异常?从日志中,可能会猜到文件没有创建,但是如何定位到哪个文件
android - 猴子命令中“1”的含义
我最近读了一本关于 android 的书。在那本运行猴子脚本的书中,介绍了以下命令:
我搜索了这个命令并找出 f 的含义。但是当我搜索“1”时,我找不到任何关于它的信息。这个“1”是什么意思?