移动互联网时至今日发展非常迅速,Android与iOS系统的手机已经成为时代的宠儿。基于移动终端的产品如雨后春笋般地冒出,要测试一个已成型的应用,从用户所见的角度来做自动化收益还是比较高的。本文旨在利用Appium工具实现移动终端UI自动化测以下重点介绍appium相关知识、以及结合手机项目进行自动化测试的实例。 


「为什么选择Appium?」

Appium是个开源的、跨平台的自动化测试工具,支持iOS、Android应用,还可以直接在PHP、Python、Ruby、C#、Clojure、Java、Objective-C、JavaScript及Perl等语言中编写测试脚本。

∷优势
  同时支持Android和iOS自动化测试,同一个手机移动项目在同一套自动化测试体系,维护起来方便;
  支持多种脚本语言,不会将测试人员限制在某种特定语言或者框架上;
  不需要重新编译应用(APP)或者任何方式修改它就可以进入测试行为;
  移动自动测试框架是开源的;

  Appium社区更活跃、有可能纳入Selenium-WebDriver体系,从而成为事实上的移动应用测试标准。


「Appium原理架构」

一、Android平台原理架构

    WebDriver script是我们的测试脚本

   中间的是Appium服务,Appium启动一个服务(4723端口),与Selenium-WebDriver测试框架相类似,Appium支持标准的WebDriver JSONWireProtocol。它提供一套Web服务Appium Server接收WebDriver标准请求,解析请求内容,调用对应框架相应操作

   Appium server会把请求转发给中间件Bootstrap.jar,它是用java编写的,安装在手机上。Bootstrap.jar接收Appium命令,最终通过调用UiAutomator的命令实现

   执行结果由Bootstrap返回给Appium Server;

   Appium还用到了Chromedriver来支持基于WebView的测试。


二、iOS平台原理架构

在iOS端,Appium同样使用WebDriver协议。与Android端测试框架不同的是,Appium iOS封装了苹果公司的Instruments框架,主要用了Instrument里的UiAutomation(Apple的自动化测试框架),然后在设备中注入bootstrap.js进行监听,如下图所示:


 WebDriver script 是selenium风格的测试脚本

 中间的是Appium服务,Appium启动一个服务(4723端口),与Selenium-WebDriver测试框架相类似,Appium支持标准的WebDriver JSONWireProtocol。它提供一套Web服务,Appium Server接收WebDriver标准请求,解析请求内容,调用对应框架相应操作;

  Appium Server调用instruments.js启动一个sock server,同时分出一个子进程运行instruments.app,将bootstrap.js注入到设备用于和外界进行交互;

 对于WebView的操作,运用了iOS webkit debug proxy来实现。


「环境搭建」

Appium录制的功能目前只支持Mac OS X ,为了最大限度让测试不被代码束缚,建议搭建环境使用Mac OS X操作系统。


一、Mac OS X系统appnium环境安装步骤

1.通过命令行安装Appium

2.通过应用程序安装Appium

可以从地址:https://github.com/appium/appium/releases下载到最新和历史的Appium安装应用程序。


点击听诊器logo确认环境是否安装成功,提示 everything looks good,bye! 表示环境正常

二、真机调试

准备工作:
一个苹果的开发者ID和有效的开发者对应的配置文件及签名文件;
一台iPad或者iPhone(把UDID加入证书里);
获取待测试应用的源码;
一台安装了Xcode和Xcode Command Line Developer Tools的Mac机器。


Appium设置界面必填字段

注意事项:真机调试时的app必须是包含描述文件的app文件,不能选择虚拟器生成的沙漏里的app文件。


三、虚拟器调试
准备工作:
  获取待测试应用的源码;
  一台安装了Xcode和Xcode Command Line Developer Tools的Mac机器。


Appium设置界面必填字段

注意:虚拟器需要选择沙盒里面的app。


四、如何快速定位页面元素
启动appium服务,点击Inspector(图中放大镜logo),在Appium Inspector界面,可以模拟各种用户在手机上的真实操作,例如单击(tab)、滑动(swipe)、输入(send key)、晃动(shake)等;另外,用户可以通过Appium Inspector单击record录制产生自动化测试代码。


录制支持Python、C#、Ruby、Objective-c、Java和Node.js。


以手机项目中的手机客户端演示版为例,使用python脚本语言,采用自带的unittest测试框架,做一个登录场景的测试验证。

一、unittest 概览
Python 测试框架分别为:doctest、unittest、nose 和 pytes,这里选择unittest。

从名字上看,它是一个单元测试框架;使用 unittest 的标准流程为:

从 unittest.TestCase 派生一个子类;
在类中定义各种以 “test_” 打头的方法;
通过 unittest.main() 函数来启动测试。


二、 unittest支持如下几个重要概念
测试装置(test fixture)
为一个或者多个测试用例做一些准备工作,例如:连接一个数据库,创建一个目录,或者开启一个进程。

测试用例(test case)
测试用例是测试行为的最小单元,通过对一些输入输出值的对比来进行测试检查。

测试套件(test suite)
将 测试用例 或者 测试用例集合 聚合组织起来的集合。可以批量执行一个测试套件内所有的测试用例。

测试执行器(test runner)
组织安排测试脚本执行活动的组件。测试执行器通过一些图形界面,文本界面或者返回一些特殊的值来展示测试脚本的测试结果。主要用于生成测试报告。


三、如何断言


四、代码部分

红框标注了断言部分


五、测试结果
包含了测试用例条数,测试时间和测试结果。


有很多人问,UI自动化应不应该投入,有没有前途。这个问题没有绝对的,要看项目的类型,总的来说针对相对比较稳定的项目,UI自动化真正的价值有两点:1是验证逻辑而非UI;2是代替大量UI重复操作。如果这个事情至上而下都是支持的,想做的,投入的方向没有错,价值认识正确,肯定是有积极的产出的。另外,UI自动化是测试生来无法回避的一种能力,可以不依赖他,但是你需要他