Android 如何在主屏幕上自动测试小部件?

Android 如何在主屏幕上自动测试小部件?,android,testing,automated-tests,android-appwidget,Android,Testing,Automated Tests,Android Appwidget,我正在寻找自动化Android应用程序小部件测试的方法。因此,测试的一部分显然是将小部件放在主屏幕上。我想出了一个解决办法,但对我的口味来说有点太老套了,所以我想知道是否有更好的办法 我的要求是使用外部脚本在模拟器上工作。现在我使用一个简单的bash脚本,但我使用的方法也应该与monkeyrunner脚本一起使用: 首先,我定义了一个函数,将密钥发送到仿真器,如下所示: send函数相当于调用 现在我可以可靠地发送一个键序列来打开菜单,选择添加键,上下两次选择Widget,选择我的Widget它

我正在寻找自动化Android应用程序小部件测试的方法。因此,测试的一部分显然是将小部件放在主屏幕上。我想出了一个解决办法,但对我的口味来说有点太老套了,所以我想知道是否有更好的办法

我的要求是使用外部脚本在模拟器上工作。现在我使用一个简单的bash脚本,但我使用的方法也应该与monkeyrunner脚本一起使用:

首先,我定义了一个函数,将密钥发送到仿真器,如下所示:

send函数相当于调用

现在我可以可靠地发送一个键序列来打开菜单,选择添加键,上下两次选择Widget,选择我的Widget它恰好是列表中的第一个,等待第二个或两个Widget配置UI出现,并在其中选择安装按钮:

$ send_many KEY_MENU KEY_A KEY_UP KEY_UP KEY_DOWN KEY_ENTER KEY_ENTER
$ sleep 2s
$ send_many KEY_UP KEY_RIGHT KEY_ENTER
最后,我将所有这些都封装在一个脚本中,该脚本通过一组avd进行迭代,例如test_avd_N,其中N是3..12的API编号,关闭任何正在运行的模拟器,打开一个新的模拟器,等待它启动并运行测试脚本。我使用快照准备所有AVD,并使用emulator-no snapshot save选项在运行之间保持快照完整


所以总的来说,它是可行的,但它很难看。我想知道我可以在这里改进什么。

使用MonkeyRunner脚本至少可以消除发送函数的笨拙。 按键顺序中的一个明显问题是使用“A”作为从主菜单添加的快捷方式。如果模拟设备使用不同的语言,那么这将不起作用,您必须在某个时候进行测试

说到这里,从API 9或10开始,仿真器上有一个经过改进的CustomLocale.apk,您可以使用它通过广播更改区域设置:

$ LOCALES=( $( aapt dump configurations "$APK "| sed -e 's/^.*lang=\(..\).*reg=\(..\).*/\1_\2/;s/_--//;s/--//' ) )
$ for LC in ${LOCALES[@]}; do
>   adb -e shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE $LC
> done
要检查仿真器是否支持此功能,请检查CustomLocale apk的包名中是否包含v2:

$ adb shell pm list packages | grep customlocale

使用MonkeyRunner脚本至少可以消除发送函数的笨拙。 按键顺序中的一个明显问题是使用“A”作为从主菜单添加的快捷方式。如果模拟设备使用不同的语言,那么这将不起作用,您必须在某个时候进行测试

说到这里,从API 9或10开始,仿真器上有一个经过改进的CustomLocale.apk,您可以使用它通过广播更改区域设置:

$ LOCALES=( $( aapt dump configurations "$APK "| sed -e 's/^.*lang=\(..\).*reg=\(..\).*/\1_\2/;s/_--//;s/--//' ) )
$ for LC in ${LOCALES[@]}; do
>   adb -e shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE $LC
> done
要检查仿真器是否支持此功能,请检查CustomLocale apk的包名中是否包含v2:

$ adb shell pm list packages | grep customlocale