软件测试基于Appium的UI自动化测试

基于Appium的UI自动化测试

为什么需要UI自动化测试

移动端APP是一个复杂的系统,不同功能之间耦合性很强,很难仅通过单元测试保障整体功能。UI测试是移动应用开发中重要的一环,但是执行速度较慢,有很多重复工作量,为了减少这些工作负担,提高工作效率,需要引入可持续集成的自动化测试方案。

为什么选择Appium

Appium是一款开源测试工具,可以用来测试安卓/iOS/Windows端的原生应用和Web混合应用。

  1. 为了应对快速迭代的移动端应用功能,越来越多的App采用混合模式,即将部分功能交给应用内嵌的Web页面实现。Appium能方便的切换测试原生应用或App内嵌的web页面,对于Hybrid App有很好的支持。

  2. Appium使用各个平台自身提供的测试框架,因此无需引入第三方代码或重新打包应用。

    平台 测试框架
    Android 4.2+ UiAutomator/UiAutomator2(默认)
    Android 2.3+ Instrumentation(由Selendroid提供)
    iOS 9.3 以上 XCUITest
    iOS 9.3 以下 UIAutomation
  3. Appium在GitHub上开源,维护频率很高, 区也有相对较高的活跃度。在 区的不断努力下,Appium能始终保持兼容最新版本的手机操作系统和官方提供的测试框架,功能也越来越完善,包括基本的log收集、录屏、基于opencv的图像识别等,以及最近版本添加的iOS 13/Android 10支持等;

  4. Appium支持通过自定义插件寻找元素,GitHub上也有第三方在开发可用插件,例如基于人工智能的icon识别控件示例工程;也可以自定义插件,使用图像识别、OCR等方式查找页面元素。

使用Cucumber组织case

Appium支持多种编程语言,包括Java、Python等,但是直接使用代码维护case可阅读性较差,学习成本也比较高,引入Cucumber可以使用更接近自然语言的方式组织case。 Cucumber是支持BDD(Behaviour-Driven Development,行为驱动开发)的工具,可以自定义语法规则模版,将文本描述的步骤转为使用代码执行的步骤。 由于Cucumber和Java 8均兼容中文文本编码,因此可以自定义中文操作步骤,比起英文代码更易于理解。以定义一个最基本的点击操作为例,预期的语法规则为,则可以使用如下定义:

编写case时,使用UI自动化测试常用的Page Object设计模式,即为APP中需要测试的UI页面定义一个Page对象,该对象中包含页面上的可操作或可校验元素,并添加常用方法。

如上定义基本的点击、滑动、输入文本等操作,建立好适当的页面和方法后,一条用例就能转化为与自然相近的case描述(开头行为注释行):

编写代码进行复杂的自定义操作

通过Cucumber定义常用操作,如点击、滑动、校验文本等,可以降低编写一条测试用例的工作量,提高测试用例可读性,但并非所有功能都可以使用常用操作的方式。尤其是因为Cucumber只支持一步一步顺序执行指令,无法进行分支或循环指令,因此复杂的操作逻辑需要在自定义步骤中编写代码完成操作。 编写代码部分封装参考Android官方提供的Espresso工程,通过链式调用的方式进行”查找-操作-校验”的流程。

以Android客户端退出登陆为例,点击底部”首页-我的”元素,若当前为未登录状态,则会弹出登陆弹出,此时底部”首页-我的”元素不可见,说明已经是未登录状态。

由于Cucumber顺序执行,无法进行,因此需要编写代码自定义退出登陆步骤:

使用Appium查找UI元素

  1. 基本查找方式

    • : 通过元素的resource-id进行查找;
    • : 通过UIAutomator2的代码文本查找。为符合UIAutomator2规范的代码文本,Appium会解析文本后使用反射的方式调用UIAutomator2进行查找;如下为使用查找文本包含的元素: 
  2. xpath查找元素
    xpath可以用来在XML文档中查找元素和属性。Appium和谷歌官方提供的uiautomatorviewer工具获取元素都是xml形式组织的,xpath可以精准定位仅靠、无法定位的元素:

    • 文案是”TEXT”元素的兄弟元素,该兄弟元素的resource-id是”ID”:
    • resource-id是”ID”且选中状态元素的子元素,该子元素的attr属性为value: 

    虽然xpath方式查找元素更精准,但是元素的路径可能受到布局改动的影响,且在iOS上性能不佳,因此推荐优先使用等方式组合定位元素

  3. 图像识别查找元素
    Appium在By Selector级别支持按照图片查找。目前不支持多元素查找,只返回第一个查找到的元素。
    让Appium支持图片查找,需要一点前期准备工作:

    1. 安装NodeJS版本的OpenCV库:

    2. Appium中配置相关参数:

StaleElementReferenceException: Appium查找到元素,之后尝试操作元素时,若元素已经不在当前页面DOM资源上时会抛出异常。 Appium使用UIAutomator2查找元素时,会保留元素的缓存,对元素进行操作时,会直接把缓存的信息交给UIAutomator2进行点击、滑动等操作。

  • 实际测试过程中,可能出现步骤:A页面跳转B页面;在B页面点击元素el。而A、B两个页面都有与el相同ID的元素,在B页面上尝试操作元素el的时候,Appium直接使用了A页面的缓存,此时会出现;
  • 由于Appium采用HTTP请求查找和操作元素,因此查找元素和操作元素实际流程是:POST查找元素->server缓存元素->POST操作缓存的元素,有时间间隔。在 络请求期间如果出现APP端弹窗等元素遮挡,也可能导致。

整体工作流程(免费领取Python自动化学习资料  工具,面试宝典面试技巧,加QQ群,785128166,群内还会大佬技术交流)

  1. htest client客户端获取打包安卓打包服务器下载列表,从中筛选出最新的APK安装包版本。如果有高于手机端的最新版本,则覆盖安装手机端花椒APP,并自动触发BVT测试用例执行(执行单个case时直接从测试平台 页端触发);
  2. 测试平台选出Cucumber描述的BVT用例集,同时查找Page页面,转义用例步骤的元素和方法,替换为客户端可使用的元素定位符(开头表示通过resource-id查找,开头表示通过文本内容查找),通过HTTP请求返回给客户端(执行单个case时使用socket方式发送)。
  3. 执行测试用例过程中,可能在查找元素时恰好遇到手机端弹窗盖住花椒APP元素等情况,因此在执行测试用例过程中,会检测手机端可能出现的、非测试步骤中预期的弹窗,包括首充弹窗、开播礼物下载弹窗等,关闭弹窗后再次查找元素;

     

  4. htest client初始化Appium driver,以Appium作为代理连接手机,并在手机端执行测试用例中的基本操作;
  5. 如果执行测试用例失败,会尝试重新执行失败的用例,如果再次失败,会收集手机端日志、保存截图和录屏,并将失败日志返回保存到测试平台中, 执行单个case时使用socket发送执行结果, 结果通过htest Server回传给测试平台进行展示, 如果bvt时,则通过接口回传结果数据

使用测试平台 页端单次执行测试用例:

 

如果对软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以加软件测试交流:1085991341,还会有同行一起技术交流。
按模块划分,整个框架分为:

 

  1. htest server: Java中间件,使用的netty框架, 负责转发socket消息,即测试平台通知客户端执行用例消息,和客户端执行结果返回测试平台。 使用:

    • 在htest中server端netty的启动

    • HttpServer、JarServer、WebsocketServer都是相同的启动方式,区别在于他们监听的端口不同,处理数据的handler不同

    • HttpServer的处理器是,处理消息是按照http协议处理的

      声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月24日
下一篇 2020年7月24日

相关推荐