UiAutomator Android Uiautomator2 脱机 Monkey 测试

xinxi · April 24, 2019 · Last by 王争伟 replied at July 15, 2019 · 5619 hits
本帖已被设为精华帖!

简介

前些日志在社区看了【有赞团队的一篇记一次基于Robotium 改造的测试实践】
https://testerhome.com/articles/18752.

文章中提到了自动化测试可以拖离PC运行,点击apk中的运行按钮就能开启自动化测试,这个思路给了我很大的启发.

本文就尝试把Android Monkey测试脱机运行,截止到写这片文章.基本功能已经实现,还查一些适配问题和优化.

自动化框架对比

现在主流移动端自动化框架,基本上都是在pc上运行来操作移动端设备.

Appium

这种cs架构的自动化框架,需要在pc上开启一个服务,然后手机上安装各种的可以通信的app,比如bootstrap、wda等.在启动测试脚本后、bootstrap接受指令,最后调度UiAutomator或者UiAutomator2底层引擎操作移动设备.

Robotium

这个项目现在已经不怎么更新了,依托Android测试环境的核心是Instrumentation框架,有依赖源码使用和不依赖源码使用的两种方案.在【有赞】的文章中提到了Robotium框架,但是看了一些Robotium的环境搭建贴还是停留在ecliese上并且都是3年以前的,果断放弃了.

atx

底层基于Google uiautomator,安装atx-agent后会在手机上开启一个http端口.也就是说服务端从pc上挪到了手机本身上了,这样就可以脱离pc达到效果.

UiAutomator2

UiAutomator2是Android提供的一个自动化测试框架,基于Instrumentation框架.提供了丰富的api方法来操作设备,Appium中也提供了UiAutomator2底层引擎.

脱机运行方案

综合了上面几个自动化测试方案,决定使用【UiAutomator2】框架.不需要开启任何端口、和Android项目天然结合.

使用

先简单介绍下UiAutomator2如何使用和一些常用api

创建一个Android UiAutomator2项目

创建一个带页面的项目,为了后期在页面中运行自动化测试做准备.

image

自动创建好项目后,会有个androidTest文件夹和ExampleInstrumentedTest.java文件.

image

在app路径下的build.gradle文件添加依赖.

image

通过Intent启动app、创建UiDevice实例并使用api方法,如点击元素和滑动等.

image

点击运行方法按钮,会使用gradle打一个androidTest.apk安装到手机上.

image

启动测试命令如下:

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

常用api

click

根据坐标点击屏幕

swipe

滑动屏幕

drag

拖拽屏幕

findObject

查询元素

dumpWindowHierarchy

获取页面xml元素

executeShellCommand

执行shell命令

pressBack

模拟返回

参数传递

在上面提到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

Monkey这部分设计,是把随机点击、滑动、返回、滚动等常用api结合起来,通过分配事件概率控制.

image

image

apk内执行

上面已经完成了Monkey开发并且可以通过命令行测试app,但是还是需要依托pc.

所以需要一个apk执行instrument命令,这样就可以脱离了pc.

创建MainActivity增加【运行】和【停止】按钮,增加运行时间输入框.会在点击【运行】按钮的同时把【时间】参数传递给【测试类】.

image

需要主要注意的是,执行instrument命令是个耗时操作,所以创建了一个子线程来执行.

image

展示效果

run.gif

app获取系统权限

目前仅对模拟器和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

共收到 8 条回复 时间 点赞

高产似母猪😂😂😂

点赞关注投币

思寒_seveniruby 将本帖设为了精华贴 25 Apr 11:12

系统签名的这个试了很多方法都不行,如果这个问题解决了,就能做很多事情了

是一次有趣的尝试

直接写个ui1.0的case里面写上apk安装和monkey运行控制,使用--nohup参数就可以了

问一下大佬...怎么能吧activity的参数带到uiautomator里面去呢?

CrashHandler能够捕获其他应用的奔溃信息吗

没看懂 ,哈哈。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up