Appium&Cucumber搭建UI自动化测试框架

博客已迁移至:https://leeon7.github.io

背景知识

WebDriver协议

一套抽象了页面行为的HTTP协议,Request表示UI操作,Response表示页面响应结果。该协议用JSON Body来描述命令和响应内容,是JSONWireProtocol的一种应用。

Appium

一个基于WebDriver协议实现的自动化测试框架,主要针对移动端,支持原生App、Web App、Hybird App。

Appium总体是一个C/S结构,即Appium Server和Appium Client。Appium Server是一个暴露一系列API的Node Server(npm install -g appium),它以HTTP Response的形式响应来自Appium Client的不同请求。Appium Client本质就是一个HTTP Request发送器,它封装了一系列API来方便的发送各种UI操作请求。Appium的这种设计优点在于Client可以被灵活的选择,不管用何种语言,何种方式,只要能够发送符合协议的HTTP Request就可以充当Appium Client。

Cucumber

一个实现BDD(Behavior-driven development)的框架。BDD暂不深究,我们主要关注Cucumber给自动化测试带来的改进。Cucumber为了良好的抽象软件行为,定义了一套DSL:Gherkin。使用Gherkin,我们可以将繁杂的自动化脚本进行拆分:将复杂的操作脚本沉淀为下层util,只暴露上层的自然语言的行为描述给开发者,大大降低脚本编写的门槛和成本。

工程设计

1. 总体结构

工程结构

工程总体是一个node工程,主要依赖了webdriveriocucumberchai三个npm包。

WebdricerIO

WebdriverIO是用Javascript实现的Appium Client,我们选用v4版本,因为v5暂不兼容Cucumber。

工程根目录的wdio.conf.js定义了WebdriverIO的初始化参数,主要定义当前Client要连接的Server地址及端口,需要连接的HTTP会话,测试脚本路径等信息。其中,配置文件里的capabilities数组代表当前Client需要开启的HTTP Session。每个capability对象代表一个Session,并定义了当前会话的测试目标,比如目标安装包路径、目标平台(Android/iOS)、目标测试设备等参数。详见configurationfileCapabilities

Cucumber

配置文件里的cucumberOpts完成对Cucumber的配置,主要关注require: ['./src/**/*.js']参数,表示转译脚本的目录。

Chai

断言库,用来得出测试结果。

2. 详细设计

脚本目录

/features

feature文件目录,feature文件即是Gherkin脚本文件,旨在使用一种自然语言描述一个可验证行为。

假如要测试一个点击按钮显示今天上不上班的App,那么我们的feature文件是这样的:

feature

蓝色文字是Gherkin的保留关键字

今天是我点击显示是页面行为,需要转译为Appium Client的API操作

单引号内的文字是输入参数

/src

src存放负责转译Gherkin的js脚本和其他脚本

先看src/steps/*.js

该目录下的js文件负责对feature文件完成转译,以上面的feature为例,转译脚本如下:

const { Given, When, Then } = require('cucumber');
const assert = require('chai').assert;

Given('今天是 {string}', function (string) {
    browser.setToday(string);
});

When('我点击 {string}', function (text) {
    browser.clickText(text);
});

Then('显示 {string}', function (string) {
    assert.equal(string, browser.getPageContent());
});

Given, When, Then分别对应假如那么

单引号里的字符串匹配feature中的页面行为入参,最终进入后面的function里,使用browser对象(即Appium Client的全局对象)请求执行不同的UI操作,即完成了转译。

除了转译脚本外,还会沉淀一些utils到这个目录下,主要是对Client API的再次封装。比如查找元素的API: browser.element(string),如果直接使用会经常因为页面未加载完而找不到元素,需要设置一个等待机制。utils.js便将封装好的方法内置到browser对象里,以方便上层调用。

Webdriverio Client的详细API文档见http://v4.webdriver.io/api.html

在配置文件里提到的require: ['./src/*/.js']参数,指向的就是转译js脚本的路径,因为这些脚本需要在执行feature文件之前被加载

Selector

UI自动化,核心是查找页面元素,因为几乎所有的页面操作(点击、输入、获取文本等)都要先准确地找到视图元素。webdriverio查找元素的方法:browser.element(string)只有一个入参,这个入参就叫selector,是一个字符串,它描述了Client希望找到一个或一组什么样的页面元素。所以,如何给目标元素编写selector是很关键的,它直接决定了我们的用例可执行与否。

官方的Selector文档基本演示了各种定位元素的策略。需要注意的是,针对原生控件,推荐使用各自平台的Selectors格式(UiSelector/UIATarget),以达到最高的成功率。前端页面则可做到平台无关。这意味着,我们可以在src目录下沉淀不同平台的Selector Generator,方便上层调用。

另外强调一个点,如何方便、迅速、优雅的查找元素,不一定只有优化selector一条路可以走,适当的从规范控件设计,页面结构等方向入手,往往可以事半功倍。总之是一个平衡的问题。

后续

有几个方向会有拓展价值和必要

  1. 不断沉淀基础操作的js脚本,越来越多的写feature,越来越少的写js
  2. 稳定性保证,retry机制
  3. 错误捕获等hook操作,现已支持错误页面截图
  4. 集成CI
  5. 测试服务机搭建,多设备,多任务执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容