前些日志在社区看了【有赞团队的一篇记一次基于Robotium 改造的测试实践】 https://testerhome.com/articles/18752.
文章中提到了自动化测试可以拖离PC运行,点击apk中的运行按钮就能开启自动化测试,这个思路给了我很大的启发.
本文就尝试把Android Monkey测试脱机运行,截止到写这篇文章.基本功能已经实现,还差一些适配问题和优化.
现在主流移动端自动化框架,基本上都是在pc上运行来操作移动端设备.
这种cs架构的自动化框架,需要在pc上开启一个服务,然后手机上安装各种的可以通信的app,比如bootstrap、wda等.在启动测试脚本后、bootstrap接受指令,最后调度UiAutomator或者UiAutomator2底层引擎操作移动设备.
这个项目现在已经不怎么更新了,依托Android测试环境的核心是Instrumentation框架,有依赖源码使用和不依赖源码使用的两种方案.在【有赞】的文章中提到了Robotium框架,但是看了一些Robotium的环境搭建贴还是停留在ecliese上并且都是3年以前的,果断放弃了.
底层基于Google uiautomator,安装atx-agent后会在手机上开启一个http端口.也就是说服务端从pc上挪到了手机本身上了,这样就可以脱离pc达到效果.
UiAutomator2是Android提供的一个自动化测试框架,基于Instrumentation框架.提供了丰富的api方法来操作设备,Appium中也提供了UiAutomator2底层引擎.
综合了上面几个自动化测试方案,决定使用【UiAutomator2】框架.不需要开启任何端口、和Android项目天然结合.
先简单介绍下UiAutomator2如何使用和一些常用api
创建一个带页面的项目,为了后期在页面中运行自动化测试做准备.
自动创建好项目后,会有个androidTest文件夹和ExampleInstrumentedTest.java文件.
在app路径下的build.gradle文件添加依赖.
通过Intent启动app、创建UiDevice实例并使用api方法,如点击元素和滑动等.
点击运行方法按钮,会使用gradle打一个androidTest.apk安装到手机上.
启动测试命令如下:
adb shell am instrument -w -r -e debug false -e class
'android.example.xinxi.monkey.ExampleInstrumentedTest#testDemo'
com.bilibili.test/android.support.test.runner.AndroidJUnitRunner
根据坐标点击屏幕
滑动屏幕
拖拽屏幕
查询元素
获取页面xml元素
执行shell命令
模拟返回
在上面提到instrument命令行启动,是可以传递参数给测试类的.主要用途是传递测试时间和测试包名.
用法如下:
adb shell am instrument -w -r -e runtime 10 debug false -e class
# 运行10分钟测试脚本
Bundle bundle = InstrumentationRegistry.getArguments();
TIMING = Integer.parseInt(bundle.getString("runtime"));
# 在代码中使用getArguments接收参数并获取字段值
Monkey这部分设计,是把随机点击、滑动、返回、滚动等常用api结合起来,通过分配事件概率控制.
上面已经完成了Monkey开发并且可以通过命令行测试app,但是还是需要依托pc.
所以需要一个apk执行instrument命令,这样就可以脱离了pc.
创建MainActivity增加【运行】和【停止】按钮,增加运行时间输入框.会在点击【运行】按钮的同时把【时间】参数传递给【测试类】.
需要主要注意的是,执行instrument命令是个耗时操作,所以创建了一个子线程来执行.
目前仅对模拟器和root过的手机适配过,原因在于在app内部执行shell命令需要系统权限.
解决方案是给app添加系统权限并且系统权限签名,在AndroidManifest.xml增加"android:sharedUserId=“android.uid.system”,然后使用platform.pk8和platform.x509.pem文件签名.
这个解决方案参考了一些帖子,尚未成功过,后续有时间了再调研.
在Android中可以自定义CrashHandler类来捕获崩溃,需要一个当前app的上下文环境,现在还获取不到被测app的崩溃,这个问题也后续调用如何捕获运行时崩溃.
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());
畅想以后的移动端自动化测试,只要把该功能集成到被测app的debug环境中,任何开发同学和测试同学都可以无成本的使用,最终达到【自动化触手可及】的效果.
项目地址: https://github.com/xinxi1990/MonKeyTest
UIAutomator2.0详解(入门篇) https://blog.csdn.net/daihuimaozideren/article/details/78331673
安卓apk重签名工具 https://github.com/pengwei1024/apkReSign/
Android Studio在只有apk情况下的的robotium自动化框架应用 https://blog.csdn.net/wokankanhao88/article/details/81335650
https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html
如何启动 instrumentation ?(android ) https://blog.csdn.net/duan5858/article/details/54670397
uiautomator2.0+脱离PC运行(apk启动uiautomator2.0+)的实现方案 http://www.voidcn.com/article/p-tkfwaruq-beo.html
keytool-importkeypair https://github.com/getfatday/keytool-importkeypair
让Android Studio支持系统签名(证书) https://zhuanlan.zhihu.com/p/48131789
实现uiautomator2.0脱离PC运行 博客地址:https://blog.csdn.net/pgz100 https://github.com/pgz100/myuiautomator
Andorid 任意界面悬浮窗,实现悬浮窗如此简单 https://www.jianshu.com/p/18cbc862ba7b https://github.com/yhaolpz/FloatWindow
Android Studio自动生成带系统签名的apk https://blog.csdn.net/cxq234843654/article/details/51557025
Uiautomator 2调试参数传递 https://blog.csdn.net/sinat_29052561/article/details/
UIAutomator2.0 简介 https://testerhome.com/topics/3588