原文地址:Android自动化测试工具调研 - Stars-One的杂货小窝
Android测试按测试方式分类,可分为两种:一种是传统逻辑单元测试(Junit),另外一种则是UI交互页面测试。
这里详细讲解第二种测试。
UI交互页面测试如果是人工进行,会消耗人力,且不一定按质量进行测试,测试不全面,不到位,于是发展了通过写测试代码来进行测试。
Monkey
首先,介绍一下Monkey这个测试框架
命名为猴子,意思的是像猴子一样没有规则的顺便乱点操作
Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。
实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。
使用的话则是通过adb shell命令来执行的,如下面例子:
//(此时指定软件会被打开并开始乱点乱按)
adb shell monkey -p com.tencent.news -v -v -v 100
MonkeyRunner
MonkeyRunner也是Android SDK内置的一个工具,但与Monkey没有太大的联系,Monkey是通过adb命令下发相关事件指令来进行测试,而MonkeyRunner采取客户端/服务端的方式来下发相关指令
其文件位于AndroidSDK目录/tools/bin/monkeyrunner.bat.bat
本质上,MonkeyRunner是个工具集API(JPythod),通过让Pythod代码可以实现模拟操作手机APP的操作,具体可参考此文monkeyrunner自动化工具详解 - 习久性成 - 博客园
编写测试脚本(Pythod)来自定义数据、事件。Monkeyrunner 足够强大了,但是录制的脚本是以坐标轴来作为定位方式,而安卓设备类型众多,各种分辨率,所以移植性不好
Espresso
此方案,目前主要用户让Android开发人员进行自测使用,测试脚本代码为Java/Kotlin
Android官方代码中,默认引用这个测试框架库,在我们新建项目的时候就可以看到,app代码目录下有以下三个文件夹
- androidTest UI的单元测试代码
- main 主代码
- test 逻辑测试代码
其中,androidTest就是所说到的UI的单元测试代码,对应的测试框架为Espresso
,基于Instrumentation
进行改造而成,测试的主要流程就是找到对应控件Id,然后进行对应的断言判断
这种方法的缺点是需要懂Android开发的相关知识才能进行测试代码的编写
如果单纯编写确实有些难度,之后与Android SDK里的UiAutomator
工具联用,UiAutomator工具文件是在AndroidSDK目录/tools/bin/uiautomatorviewer.bat
UiAutomator
工具,主要功能就是会将当前的APP页面进行截图,然后分析View的层次结构,并展示View的相关属性信息,如控件ID,margin,text等实际上,UiAutomator底层使用的无障碍服务(AccessibilityService)那套API,唯一有所区别的是,UiAutomator是shell环境才能使用,而AccessibilityService可以在APP使用(需要用户手动开启权限)
可以通过Android Studio
中的run
->Record Espresso Test
,打开一个对话框,通过此对话框,可以进行相关流程的测试,之后完成后自动生成对应的测试代码
详情过程可参考这篇文章Android Espresso使用 - 爱码网
Instrumentation框架是Android测试环境的核心,很多测试框架都是基于其实现。
Instrumentation其实是Android Framework中的一个类,它的作用简单来说就是能够监控Android系统和Application之间的交互。因此实现了测试应用程序对应用程序的控制。
Instrumentation`会在App启动阶段被初始化,然后作为一个实例变量保存到ActivityThread对象中。Application的创建,Activity生命周期方法的回调等其他操作,都会经过Instrumentation来完成,会先调用Instrumentation的相应方法。
Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。可以把Instrumentation理解为没有界面的activity,它具有启动能力和监控能力。
Appium
在说这个之前,先说下Selenium,Selenium是用来进行Web测试的框架,
selenium 本身是一套web自动化测试工具,但其经常被用于爬虫,解决一些复杂爬虫的问题。
selenium 用于爬虫时,相当于模拟人操作浏览器,之后由此框架发展出了其他的框架
- Robotium
也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。
- Selendroid
基于Instrumentation的测试框架,可以测试Native App、Hybird App、Web App,但是网上资料较少,社区活跃度也不大,可以看做是一个Web版的Robotium,使用入门课参考selendroid 入门 · TesterHome
示例脚本:
AndroidDriver driver = new AndroidDriver(new URL("http://localhost:8080/wd/hub"), getDefaultCapabilities());
driver.findElement(By.id("startUserRegistration")).click();
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement inputUsername = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("inputUsername")));
inputUsername.sendKeys(user.getUsername());
Assert.assertEquals(nameInput.getText(), "Mr. Burns");
nameInput.clear();
nameInput.sendKeys(user.getName());
takeScreenShot("User data entered.");
driver.findElement(By.id("btnRegisterUser")).click();
而Appium也是从Selenium延伸出来的,是目前最主流的移动测试自动化框架,不仅支持 An