我正在寻找自动测试Android应用小工具的方法。因此,部分测试显然是将小部件放在主屏幕上。我提出了一个解决方案,但对我的口味有点过于讨厌,所以我想知道是否有更好的方法。
我的要求是使用外部脚本在模拟器上工作。现在我使用一个简单的bash脚本,但我使用的方法也应该使用monkeyrunner脚本:
首先,我定义了一个将密钥发送到模拟器的函数,如indicated on SO:
function send() { ( nc -w 2 localhost 5554 <<EOL
event send $*
quit
EOL
) | grep -E -v "OK|KO|Android Console" ; }
和
function send_many() { for i in $* ; do send EV_KEY:$i:1 EV_KEY:$i:0 ; done ; }
send()
功能相当于调用MonkeyDevice.send(..., DOWN_AND_UP)。
现在我可以可靠地发送一个按键序列来打开菜单,选择添加(一个键),然后向上两次向下选择“小部件”,选择我的小部件(它恰好是列表中的第一个) ,等待一两秒钟以显示窗口小部件配置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
选项在运行之间保持快照完整。
总体来说它有效,但它很不雅观。我想知道我能在这里改进什么。
答案 0 :(得分:4)
使用MonkeyRunner脚本至少会消除send
函数的笨拙。
键序列中的一个明显问题是使用“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