开始之前,说个好玩的事情:在我人生的几个目标中,写书算是其中一个。对写书有一定的执念可能是实在想在这个世界上留下点什么。 那些有丰功伟绩的人自然有别人帮他们书写在历史中,可是像我们这样的凡人,要想留下点什么就只能靠自己了,所以幸好还有文字可以作为文明传播的媒介。

在我原本的计划中,这个目标应该是在工作10年之后才会启动,但不知道看了那本书受到了启发:我们总是在说如果我XX就去做XX事情,但如果一件事情你早晚都要做,那为什么不早一点启动呢?人生其实没有那么多如果,所以这也是这部专栏由来的原因。

我知道这件事情对于没有写作过的我应该有些困难,所以一开始我没有给自己定很高的目标,起初只是想要写10篇文章,每篇2000字。第一篇文章大概难产了一个月的时间,尽管很难产但是我的内心始终记得这个目标,所以最终他还是诞生了。现在刚好到了第十篇的内容,其实也算是阶段性的完成了最初的目标,有必要mark一下。写这部专栏希望不仅仅能给你们带来职业上的知识,也希望你们能够受到启发,遵从自己的内心去做一些事情,不自我设限,你才能去进行更多的尝试,我鼓励自己也鼓励你们去尝试更多的事情,保持对世界的好奇心。在整个专栏的输出的过程中 我也在不断的进行输入:比如为了产出我去阅读了如何写作的书籍,建立我的写作体系最基本的价值观:对自己诚实和对读者诚实,也正如在开篇写的那样我鼓励适合的同学走上测试开发的职业生涯道路,对于那些有想法做开发并为此已经努力了的同学再坚持一下、继续坚持自己内心真实的想法。所以写专栏于我而言也算是做了一件一举多得的事情了。

前言

关于UI自动化,如果你们工作过一段时间,可能会知道很多人不看好UI自动化,因为觉得UI自动化维护的成本比较高,case稳定性不好。那么我们是否就不再需要掌握UI自动化的技能,不需要进行UI自动化建设吗?在这里我表达我的几个观点:

  1. 我们有必要掌握UI自动化建设的技能。UI自动化在某些业务场景下的确不需要进行建设,但是实际工作中还是存在一些场景 利用自动化能帮助我们节约一定的回归时间。比如我现在所负责的业务中有一个嵌入在别人APP中的SDK,尽管我们本身的迭代节奏可能很慢,但是其宿住APP仍旧保持着2周一个小版本、1个月一个大版本的发布节奏,因为我们SDK中一些基础设施是依赖其宿主APP的,所以尽管我们没有做什么改动,但是我们仍然要参与他们每个发布版本的回归工作,此时UI自动化就能帮助我们做一些回归工作,从而解放了我们自身。所以不同的业务场景下自动化发挥的功效是不一样的,在建设的时候我们应该尽量选择那些能最大程度帮助提效的部分进行相应的自动化建设。
  2. 后续进行APP端的专项测试的时候,如果只靠手动操作显然是不科学,使用自动化操作能够达到每一次的测试步骤是一致的,所以掌握Ui自动化的技能其实是在为后续进行更高级的测试打基础。
  3. 自动化测试是测试开发工程师的发展方向,虽然大家熟悉之后可能觉得其中需要的技术含量也没有想象中的高,但是我们要知道我们的最终目标是为业务质量负责,如果不是纯粹的科研机构,技术其实从不是我们最终追求的目标,我们目标一直都是用技术为我们的业务负责,去促成业务的快速和高质量迭代。我们需要跟踪业内的技术动态,一直使自己处于前沿才不至于被淘汰。

    我目前做的UI自动化主要是围绕APP端的,同时由于ios的自动化实践对你们来说成本会比较高(需要mac笔记本以及iphone手机),所以本篇内容是围绕着Android平台的UI自动化进行的介绍。

框架概览

目前关于UI自动化的框架其实主要分为2类:一类是会区分终端类型,直接与系统进行交互的框架,这类框架通常由操作系统的开发者编写提供(因为需要和底层操作系统交互),如google和apple;另一类是基于第一种类型进行抽象封装的框架,如Appium、Macaca、Airtest等。我们目前讨论比较多的其实是第二类框架,因为第二类框架通常具有跨平台、跨语言编码写的能力,具体详情可参考资料:https://testerhome.com/topics/6602http://airtest.netea***/docs/docs_AirtestIDE-zh_CN/。
我这里把文章中关键表格引用一下,让大家有一个基本的认识:

之所以引用这个表格,也是因为总结相对来说是清晰易懂的。除了上面表格列举的,还有网易开发的airtest框架,airtest是基于python的框架。在这些框架中从我个人的角度,还是比较推荐大家学习appium,除去我的个人意见,我曾经报名的霍格沃茨学院的一个课程中的老师也是这样推荐的,所以大家还是学习比较主流的技术会好一点。我目前掌握的也只是基于appium的自动化建设的技能,本篇文章给大家展示的demo也是基于appium的。

开发环境准备

为了能够回答appium的原理是什么,我们需要动手实践才能有更加深刻的印象,所以先带着大家把appium运行所需要的开发环境安装一下,环境的安装主要分为四个部分:
(1)安装Java SDK和Android SDK:为了驱动Android设备我们需要安装Android SDK,里面有adb命令行工具,而Android SDK的使用又需要Java 的JDK。这里我比较推荐大家直接下载Android Studio来配置Android SDK。
(2)安装Node js和Appium-Desktop:因为Appium的server是用js开发 所以需要先安装node js,Appium-Desktop不仅仅包含了Appium server,还提供了一些周边工具,如用例录制,UI元素查找,对于初学者建议先安装Appium-Desktop进行熟悉。
(3)开发语言依然选用java,所以在写代码的时候我们会选择java-client的jar 依赖,之后会给大家展示。
(4)需要准备一个Android的真机或者模拟器,准备一个待测APP,比如我选择雪球APP,你们也可以选择一个你们想要测试的一个APP。

同样的环境安装应该有很多教程,大家google或百度即可,只是与接口自动化的环境安装相比,移动端的自动化安装可能相对来说要配置的比较多所以给大家总结了一下我们要安装的以上(1)(2)(3)三个方面的内容。

Appium原理

在学习某一个知识的时候要有输出的目标才能学习的更加记忆深刻,那么关于appium学习完了之后你的收获目标是什么?对于我而言,学习appium之后我们应该能说出(1)appium的原理(2)appium中常见的元素定位方式(3)appium中常见的ui操作(4)在不断实践(应用在日常工作)的过程中你遇到过那些坑,你的实践收获是什么。基本上如果你能回到上面这几个问题,其实你就可以给别人教appium了。

Appium和testng此类测试框架是不同的,testng是更底层的解决自动化测试过程的框架,而appium帮助我们解决的是我们如何用多种语言、去驱动多种类型的被测设备(Android平台和ios平台)的一个工具(也就是我们说的框架)。Appium本身并不提供能直接驱动移动设备的api,它实际上还是借助uiautomator、webdrivera