移动跨平台自动化测试框架有哪些Appium源码的控件哈希表优化问题

移动自动化测试框架Appium - 开源力量丨向IT技术大牛们学习! - 大数据丨云计算丨移动开发丨软件开发测试丨 全球前沿技术抢先学!!
优秀的iOS、Android自动化测试框架Appium
Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。Appium对IOS系统的支持得益于Dan Cuellar&s对于IOS自动化的研究。Appium也集成了Selendroid,来支持老android版本。
使用Appium进行自动化测试有两个好处:
1. Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改自己的应用。
2. Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架。如果只使用Apple的UIAutomation,我们只能用javascript来编写测试用例,而且只能用Instruction来运行测试用例。同样,如果只使用Google的UIAutomation,我们就只能用java来编写测试用例。Appium实现了真正的跨平台自动化测试。
1. 移动测试的关注点
2. 移动测试的常见框架和优缺点
3. appium的功能
4. appium的基本使用
5. 云测服务介绍
1. 移动测试介绍
2. appium原理
3. appium使用场景
4. appium使用方法
5. appium的优缺点
6. 移动测试实践建议
先后工作于阿里巴巴,百度,创新工场,testin目前为oneapm的测试架构师.8年以上的行业一线测试实践经验,专注于测试行业的技术和实践研究与应用.
测试架构师
开始学习课时
开始学习课时
学完了课时
开始学习课时
服务时间: 9:00 - 21:00
微信公众号:开源力量点击阅读原文
移动端 App UI 自动化测试浅谈
日 发布,来源:
很多做测试的同学对UI自动化充满着向往,但又充满畏惧,经常不知道如何入手。一方面是因为技术薄弱,觉得自动化测试比较难,另一方面可能对自动化测试持怀疑态度。那到底什么是UI自动化测试,它能给我们带来什么样的价值呢?下面我们探讨下移动端的UI自动化方法。
什么是UI自动化?
首先,我们引用来自Monkey大神对的定义:UI自动化包括界面层面(控件,元素,位置,显示等的识别)以及功能交互层面(往往是通过代码或者测试框架来模拟真实用户的操作)
从个人的理解来看,UI自动化是通过工具或者脚本语言将测试过程模拟出来,并重复执行,用以验证功能是否正确的过程。
为什么要做UI自动化测试?
对于移动app而言,很多公司都采用敏捷开发的模式,因此测试也必须敏捷测试,每个迭代的周期非常短,经常要对原有功能进行回归测试,增加大量重复人力成本。引入UI自动化测试可以用来快速回归测试app原有功能,测试人员只需要关注新功能的测试。
移动端App的测试用例大部分是功能验证相关的用例,通过UI操作即可验证,这就为UI自动化提供了便利条件。
测试重复度高,执行效率低,通过UI自动化可以快速重复执行,达到提高测试效率的目的。
常用UI自动化测试工具
这几年,移动端技术发展非常迅速,测试手段也同样发展迅速,出现了大量用于对移动端app进行自动化测试的工具,下面简单列举下:
Monkey 是 Google 开发的UI/应用测试工具,也是命令行工具,主要针对压力测试。你可以在任意的模拟器示例或者设备上运行。Monkey 发送一个用户事件的 pseudo-random 流给系统,作为你开发应用的压力测试。
IOS UI Automation,基于IOS instrument。
MonkeyTalk 通过在App中加入client自动化为 iOS 和 Android 应用进行真实的,功能性交互测试。有成熟的集成开发环境,有API支持和持续集成解决方案,且方便二次开发,目前不开源,属于功能强大但没有被很好推广的测试框架。
Robolectric 是一款Android单元测试框架,使用 Android SDK jar,所以你可以使用测试驱动开发 Android 应用。
Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测试。另外,Robotium 4.0版本已经支持对WebView的操作。
uiautomator 测试框架提高用户界面(UI)的测试效率,通过自动创建功能 UI 测试示例,可以在一个或者多个设备上运行你的应用。
Selendroid 使用 Selenium 2 客户端 API 编写。可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。
Appium是一个开源的、跨平台的自动化测试工具,适用于测试原生或混合型移动App,支持iOS、Android和FirefoxOS平台。
Calabash是一款适用于iOS和Android平台的跨平台应用测试框架,支持Cucumber,开源且免费,隶属于Xamarin公司。
主流跨平台UI自动化测试框架的对比分析
一个好的自动化测试框架,它应该是要能够支持跨平台的,目前市面上有三个主流的跨平台测试框架,这里简单比较分析三个框架的优缺点。
MonkeyTalk
支持的平台
Android、iOS、H5
Android、iOS、H5
Android、iOS、H5
Appium、Node、JDK、Android SDK、Selenium、Xcode
Calabash、Gem、Ruby、JDK、Android SDK、Xcode
MonkeyTalk、Android SDK、Xcode
支持的语言
Almost Any
MonkeyTalk、Java、Javascript
支持录制回放
通过扩展WebDriver API编写脚本模拟测试步骤,然后通过Server翻译后发送给对应的移动设备
使用Cucumber框架组织测试用例,通过Http和Json与测试app通信
通过嵌入在app中的client对用户操作进行录制回放
开源,社区活跃
行为描述语言,用例重用度高
录制回放,无需编码,环境易于搭建
大量编码,元素难以定位
环境复杂,UI难以定位
灵活性稍差,需要在App中安装Client
套用网上一位测试朋友的话,“自动化测试听起来很神秘,学起来很简单,用起来很麻烦”。UI自动化的优点很多,但要考虑适用场景,否则适得其反。同样,我们也要选好一个适合的自动化框架,这样才能提高效率。总而言之,想搞好自动化测试,还需要测试人员不断地提高测试理解力,分析能力和代码水平。
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)自动化测试框架(二):Appium基础
申明:本章节引用很多第三方资料和网上的教程,在参考资料tab中我都有备注,请理解。
一:Appium介绍
Appium是由nodejs的express框架写的Http Server。Appium不是它??创建?套新的测试框架,是将现有的优秀的框架进?了集成,以Selenium WebDriver的协议(JsonWireProtocol/Restful web service)统?起来. 使得这个框架满多的需求。Appium启动?动化测试后,在被测设备上启动?个server,监听来?Appium server的指令。不同的平台(如,)采?不同的运?和交换?式。Appium将某个桩程序&侵入&平台,用于接受指令,来完成测试脚本的运行。
1. 跨平台, native hybrid webview(H5)
2. 跨设备, android iOS
3. 跨app,可以在多个app之间交互
4. 不依赖APP开源代码( Android 对H5的支持需要代码支持,这里不细说)
5. 支持Selenium WebDriver / Selenium Grid
6. 跨语言, java python ruby nodejs
7. Open Source
二:Appium工作原理
1.原理图:
在Android端,appium基于WebDriver,并利?用Bootstrap.js,最后通过调?用UiAutomator的命令,实现App的自动化测试。UiAutomatZ喎"/kf/ware/vc/" target="_blank" class="keylink">vcrLiytS/8rzcysdBbmRyb2lkIFNESz/X1LT4tcRBcHAgVUnX1Lavu6+y4srUSmF2Yb/ioaPB7c3i08nT2lVpQXV0b21hdG9yttRINbXEP9ans9bT0M/eo6xhcHBpdW3S/cjrwctjaHJvbWVkcml2ZXLAtMq1z9a7+dPaSDW1xNfUtq+7r6GjPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+Mi7W99Kq1K3A7aO6PC9wPg0K1/Ox37XEV2ViRHJpdmVyIHNjcmlwdMrHztLDx7XEc2VsZW5pdW2y4srUvcWxviDW0LzkysfG8LXEQXBwaXVttcS3/s7xo6xBcHBpdW3U2tXisd/G8MHL0ru49lNlcnZlcqOoNDcyM7bLv9qjqaOsuPpzZWxlbml1bSBXZWJkcml2ZXKy4srUv/K83MDgy8ajrEFwcGl1bT/Wp7PWserXvLXEV2ViRHJpdmVyIEpTT05XaXJlUHJvdG9jb2wgoaPU2tXiwO/M4bmpwcvSu8zXd2Vit/7O8aOsQXBwaXVtIFNlcnZlcr3TytV3ZWIgZHJpdmVyILHq17zH68fzo6y94s72x+vH88TayN2jrLX3P9PDttTTprXEv/K83M/s06ay2df3oaPI56O6vcWxvreiy83Su7j2teO797C0xaW1xMfrx/O4+GFwcGl1bSBzZXJ2ZXIgYXBwaXVtIHNlcnZlcrvhsNHH68fz16q3orj41tC85Lz+Qm9vdHN0cmFwLmphciCjrMv8ysfTw2phdmHQtLXEo6ywstew1NrK1rv6yc8uQm9vdHN0cmFwIL3TytVhcHBpdW0gtcTD/MHuKDQ3MjS2y7/aKaOs1+7W1c2ouf219z/Tw1VpQXV0b21hdG9ytcTD/MHuwLTKtc/WINfuuvPWtD/Q0LXEveG5+9PJQm9vdHN0cmFwt7W72Lj4YXBwaXVtIHNlcnZlciDB7c3io6xhcHBpdW27udPDtb3By2Nocm9tZWRyaXZlcsC0P9ans9a7+dPaSDWjqHdlYnZpZXejqbXEsuLK1A0KPGgzIGlkPQ=="ios端">iOS端
1.原理图:
在IOS端,appium同样使?用WebDriver的?一套协议。与Android端测试框架不同的是,appium ios封装了apple的 Instruments框架,主要用了Instrument里的UI Automation(Apple的?自动化测试框架),然后在设备中注?入bootstrap.js进?行监听。
2.主要原理
左边的WebDriver script是selenium测试脚本 中间是起的Appium的服务,Appium在这边起了?一个Server(4723端口),跟selenium Webdriver测试框架类似,Appium?支持标准的WebDriver JSONWireProtocol 。在这里提供了一套web服务,Appium Server接收web driver 标准请求,解析请求内容,调?用对应的框架响应操作。如:脚本发送一个点击按钮的请求给appium server。 appium server调用instruments.js 启动?一个socket server,同时分出?一个?子进程运?行instruments.app,将bootstrap.js(一个UIAutomation脚本)注?入到device?用于和外界进?行交互 对于H5的操作,运?用了 iOS webkit debug proxy来实现
三:安装Appium
这一部分,其实网上都有非常详细的教程,这里就不一一阐述
主要的步骤为:
安装JDK并配置环境变量 安装Android SDK并配置环境变量 安装Nodejs 安装appium 验证安装
相关资料:
Appium for Windows环境搭建:
Appium for iOS 环境建:
四:DesiredCapabilities
DesiredCapabilities携带了一些配置信息,在启动session 时必须提供,如启动模式,apk/app配置,package/activity配置,配置,键盘配置。从本质讲 是一组 key- value形式的对象 ,你可以理解为java里的json对象。(你可以在selenium-api-2.49.0- sources.jar 查看CapabilityType的声明)
DesiredCapabilities的重要作用是在启动时传递信息给Appium Server。可以粗略的分为两类:设备信息类和应用信息类
设备信息:设备是真机还是模拟器,手机操作以及版本等。 应用信息:要进行浏览器测试还是移动端测试,如果是移动应用,安装apk或者app文件的路径,如果是浏览器测试,浏览器的类型是什么。
下图列举了DesiredCapabilities常用的关键字:
Session介绍
Session是指一个在终端用户与交互系统进行通讯的会话,用于保持状态的基于web服务器的方法。将Appium理解为server端,客户端设备发起command的必须是在session start后才可以进行的。一般来说,通过post/session这个url,然后传入DesiredCapabilities就开启session啦。
DesiredCapabilities的使用:
DesiredCapabilities caps = new DesiredCapabilities();
// apk地址,不需要安装的话这行不需要
// File app=new File(&C:\\Users\\charlie.chen\\djigo.apk&);
// 不需要安装的话就去掉这个
// caps.setCapability(&app&, app.getAbsolutePath());
caps.setCapability(&platformName&, &Android&);
caps.setCapability(&platformVersion&, &6.0&);
caps.setCapability(&deviceName&, &P9&);
caps.setCapability(&udid&, udid);
caps.setCapability(&appPackage&, appPackage);
caps.setCapability(&appActivity&, appActivity);
// caps.setCapability(MobileCapabilityType.BROWSER_NAME, &Chrome&);
caps.setCapability(&unicodeKeyboard&, &True&); // 支持中文输入
caps.setCapability(&resetKeyboard&, &True&); // 重置输入法为系统默认
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability(&platformName&, &iOS&);
caps.setCapability(&platformVersion&, &9.3&);
caps.setCapability(&deviceName&, &iPhone 6s&);
caps.setCapability(&unicodeKeyboard&, &True&);
caps.setCapability(&resetKeyboard&, &True&);
五:元素的定位
UIAutomatorViewer是Andorid SDK自动的一个app元素查看工具,通过这个工具我们可以查看app view上面的元素的属性,然后再利用Appium各个API对元素进行定位操作。
UIAutomatorViewer使用:
将测试设备连接电脑,并且将被测app签名后安装在测试机。 打开安装的SDK文件夹,在sdk/toos下找到uiautomatorviewer.bat,运行
如图右下方可以看到定位的元素属性:index,text,id,classname,。。。。
常见的元素定位的方法:
通过id定位:
dirver.findElement(By.id(&id is me&));
通过name定位
dirver.findElement(By.name(&name is me&));
//name其实就是text
通过clssName定位
dirver.findElement(By.className(&className is me&));
通过xpath定位
dirver.findElement((By.xpath(&//android.widget.TextView[contains(@text,'天空之城')]&));
List textViewList=driver.findElements(By.id(&id is me&));
textViewList.get(0).sendKeys(&Some Name&);
textViewList.get(1).sendKeys(&&);
通过坐标定位
TouchAction to = new TouchAction(driver);
to.tap(x, y).release().perform();
六:一个简单的脚本
package com.appium.
import org.openqa.selenium.By;
import org.openqa.selenium.WebE
import org.openqa.selenium.remote.CapabilityT
import org.openqa.selenium.remote.DesiredC
import io.appium.java_client.android.AndroidD
import java.io.F
import java.net.URL;
import java.util.L
public class AppDemo {
public static void main(String[] args){
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, &&);
capabilities.setCapability(&platformName&, &Android&);
capabilities.setCapability(&deviceName&,&Android Emulator&);
capabilities.setCapability(&platformVersion&, &4.4&);
capabilities.setCapability(&app&, app.getAbsolutePath());
capabilities.setCapability(&appPackage&, &com.example.demo&);
capabilities.setCapability(&appActivity&, &.WelcomeAcitvity&);
driver = new AndroidDriver(new URL(&http://127.0.0.1:4723/wd/hub&), capabilities);
WebElement el = driver.findElement(By.name(&Add Contact&));
el.click();
List textViewList=driver.findElements(By.id(&id is me&));
textViewList.get(0).sendKeys(&Some Name&);
textViewList.get(1).sendKeys(&&);
driver.findElementByName(&Save&).click();
driver.quit();APP端UI分层自动化测试框架的搭建过程
阅读这一小节,需要读者具备如下前提条件:
1. 掌握一种编程语言基础,如java、python等。
2. 掌握一种单元测试框架,如java语言的testng框架、python的unittest框架。
3. 掌握目前主流的UI测试框架,移动端APP测试框架Appium,或者掌握Web端测试框架Selenium。
4. 如果是Appium框架,还需要掌握如何定位控件元素,原生页面可使用安卓SDK自带的uiautomatorviewer工具,webview页面可以使用Chrome浏览器输入"chrome://inspect/#devices",该方法需要翻墙或者修改hosts。
5. 如果是Web端,浏览器中打开F12即可
下面以Appium+python+unittest为例介绍UI自动化框架的搭建思路
1. 最开始入门级别的代码。
以登录页面举例,如下:
由于代码显示比较小,需要更大字体代码的朋友可以加我微信:fosterwu 来获取文档进一步学习
最开始的登录脚本:
2. 对元素操作的公用方法进行封装
按照上述代码写了很多行,发现每次操作元素都要写同样的代码,一是啰嗦,二是工作量大,这样就要将重复高的操作抽象出来进行封装成类,及把元素定位,元素点击,元素输入、页面滑动等方法进行封装,如下代码:
上述代码只是展示了查找元素的方法,在BaseAction类中封装元素对象的重用操作代码笔者就不贴出来,大家明白思路即可。
3. 测试代码和测试数据分离
开始测试数据还是写在测试代码中,如果用例多了,后期需要修改数据,这样只能在测试代码中修改,实际中没有这样维护代码的,所以需要将测试数据和代码分离,笔者选择ini配置文件存放数据。
那么问题来了,把数据放在ini配置文件中,在代码中怎样获取数据呢,这就需要将操作配置文件的方法封装成一个单独的类,即如下代码
通过对元素操作公用方法的封装和测试代码和测试数据的分类,优化的脚本如下:
存放数据的ini配置文件:
存放元素控件:
存放元素输入的数据:
测试脚本:
4. 通用的公用类封装
以上的脚本中,其实还缺少一些东西,如启动appiumsever,日志记录,发送邮件,数据库操作等,这几种操作都是框架公用的,所以单独封装成类,代码如下:
appiumsever类:
log工具类:
还有发送邮件类和数据库操作类笔者就不贴出来了,重在大家理解思路即可。
5. 笔者框架分层分享
现在在测试界吹嘘的分层自动化,意思就是把各种代码实现的类根据不同的功能进行分层,自动化测试框架包括的元素大致如下:
基于Appium框架运用python语言以及unittest单元测试框架,搭建的APP的UI自动化框架如下:
apk: 存放app的apk安装包
config: 存放配置文件以及测试数据,把所有的项目的配置均放在 这里,用python支持较好的配置文件格式如ini等进行配置。
实现配置和数据与代码分离。
screenshot: 存放测试用到的图片以及测试时用例失败截图
log: 存放日志文件,包括运行时日志runtime.log、error.log和appium.log日志
report: 存放生成的html格式的测试报告文件
src:源码层
common层: 框架级公用方法库
chche.py: 缓存
dbsever.py: 数据库操作封装公用类
emailsever.py: 发送邮件服务封装公用类
confparser.py: 配置文件解析器
log.py: 日志记录工具
appiumsever.py: appium服务公用类
initappdriver.py: 初始化driver类
adbconnect.py: adb连接操作
(如果还有框架级别的公用方法,还可以在该层封装成类,通过面向对象的方式调用即可)
functions层: 用例级公用方法库(元素操作公用方法封装,基于PageObject模式对控件公用方法封装,常用业务操作封装)
eleaction.py: 封装元素操作的一些公共方法
login.py: 登录操作
(该层主要是封装用例层面的公用方法,常用的操作步骤,针对PageObject思想对不同类型的页面控件元素的操作封装等)
testcase层: 测试用例层
basecase.py: 测试用例基础类
testcase1.py: 测试用例1
runner层: 测试套件层
testrunner.py: 各种加载测试用例的方法封装,以及生成报告
run.py: 执行器,整个框架运行该文件即可
下面是笔者搭建的一个小框架,仅供参考:
备注:笔者只是将个人不断摸索的东西分享给大家,因笔者没有参加过任何测试培训也不是开发出身也不是计算机专业,深知一个人摸索的难处,此篇文章大神请绕过,不喜勿喷,欢迎大家提出建议,笔者微信号:A。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 自动化测试框架有哪些 的文章

 

随机推荐