Macaca-iOS入门那些事2

一. 前言

上文《Macaca-iOS入门那些事》讲到Macaca环境部署及运行了第一个案例,本文将讲解其案例编写。

二. 测试案例解析

iOS案例:macaca-mobile-sample.test.js,由2部分组成:

  1. 配置
  2. 测试案例

以上代码兼顾了Android,所以会有冗余,简化如下:

1. 配置

var iOSOpts = {
platformName: 'iOS',
platformVersion: '9.3',
deviceName: 'iPhone 5s',
app: '/Users/chenximing/workspace/ios/macaca-test2/macaca-test-sample/app/ios-app-bootstrap.zip'
};
/*
platformName:平台名称
platformVersion:iOS系统版本,框架好像没用到这个参数,所以这玩意不重要
deviceName:设备名称
app:被测app路径
*/

2. 测试案例

var wd = require('webdriver-client')(iOSOpts);
describe('macaca mobile sample', function() {
this.timeout(5 * 60 * 1000);
var driver = wd.initPromiseChain();
driver.configureHttp({
timeout: 600000
}); before(function() {
return driver
.initDriver();
}); after(function() {
return driver
.sleep(1000)
.quit();
}); it('#1 should login success', function() {
return driver
.login('12345678', '111111')
.sleep(1000);
}); ... });

这里可以细分为:

(1). driver初始化
var wd = require('webdriver-client')(iOSOpts);
......
var driver = wd.initPromiseChain();
driver.configureHttp({
timeout: 600000
});

webdriver-client是什么?

上篇说到macaca是c-s模式的测试框架,client负责被案例端调用的API,server负责调起instruments以及控制其执行测试。webdriver-client就是上面说到的client端,提供控制操作的API,《Macaca的API文档》

(2). 测试框架
describe('macaca mobile sample', function() {
this.timeout(5 * 60 * 1000); ...... before(function() {
return driver
.initDriver();
}); after(function() {
return driver
.sleep(1000)
.quit();
}); it('#1 should login success', function() {
return driver
.login('12345678', '111111')
.sleep(1000);
}); ... });

在这里,Macaca使用一个第三方的测试框架Mocha,macaca-cli在run的时候加载该框架。

describe、before、after、it等关键字均为Mocha提供,和传统XUnit框架功能类似(Mocha默认是BDD模式,而XUnit是TDD模式),想了解更多,见Mocha主页

(3). 测试案例
...

it('#1 should login success', function() {
return driver
.login('12345678', '111111')
.sleep(1000);
}); ...

it部分就是测试案例。

三. 进阶

1. BDD(Behavior-driven development)

为什么我会介绍BDD? 因为Mocha就基于BDD思想的测试框架,并且我估计会有人把 BDD链式调用 的概念搞混。

BDD(Behavior Driven Development:行为驱动开发),是基于TDD发展的一种解决问题的思想,通过用类似自然语言方式描述软件行为,以达到可读性更高(让非技术人员也可以看懂)。

以上测试代码中,属于BDD部分由Mocha提供的,如:describe, it, before, after...这些均为BDD风格的接口。如果是TDD风格(如:XUnit)的接口则是:suite, test, setup, teardown...

2. 链式调用

(1)什么是链式调用
driver
.native()
.elementByName('PERSONAL')
.click()
.sleep(1000)
.takeScreenshot()
.elementByName('Logout')
.click()
.sleep(1000)
.takeScreenshot();

以上代码组织方式为:链式调用。

如果你之前把BDD链式调用搞混,估计看过以下代码:

When(...).Then(...).And(...).Should(...)

这段代码就是BDD接口以链式方式调用,可读性非常高!但关于BDD的部分其实还是:When、Then、And、Should...

(2)为何Macaca测试案例使用链式调用风格?

某些情况下,使用链式调用方式书写代码是很舒服的,如C#的linq:

var rs = user.Where(x => x.Length == 3).Select(x => x).ToList();

但如果把所有测试操作(无论操作间有无关联)都用链式调用方式组合,就比较奇怪了。如:

	return driver
.webview()
.elementById('pushView')
.tap()
.sleep(5000)
.webview()
.elementById('popView')
.tap()
.sleep(5000)
.takeScreenshot();

上面2个webview element的操作是没有任何关系的。而使用链式调用的场景一般是前后依赖、连续操作、层级递进,如上面的linq例子:where的结果集,接着要进行数据提取,然后是再把集合封装为list结构。

所以,基于链式调用的原意,上面的案例的写法就有些奇怪了,并且Node.js的新手也不习惯。然而,为啥作者会写出这种的测试代码?原因在于:Node.js这个语言!

Node.js是异步编程语言,例子如下:

  var el = driver.webview().elementById('hyddd')
el.tap()

上面2句,同步编程语言是怎么理解呢?

(1)获取hyddd的element;

(2)对element进行tap()操作;

但换作异步编程语言呢?

(1)获取hyddd的element;

(2)el.tap()同时于(1)执行,也就说,el还没赋值,(2)就已经开始执行了,完全没等(1)返回(2)就执行了;

没法好好玩耍了,如果原生Node.js程序时要处理同步场景,就会出现所谓的callback hell,为了避免callback hell,就出现了Promise模式。嗯,在上面的测试代码中是不是看到这个单词?它作用就是把异步模式变为同步模式,同时避免callback hell。而它的表现就是现在这种链式调用!!!所以测试案例长得比较奇怪是开发语言导致的。

就个人的测试哲学而言,脚本性的语言是最适合写测试脚本的,但Node.js异步编程风格比较特别,增加了测试案例编写者入门门槛,所以我其实更倾向Python。前几天和Macaca作者聊过,对Python的支持估计也要等一段时间,希望这天尽快到来。

Macaca-iOS入门那些事2的更多相关文章

  1. Macaca-iOS入门那些事

    Macaca-iOS入门那些事 一. 前言 最近有朋友向我请教iOS自动化测试框架选型,刚好前段时间做讲座时发现了macaca,遂试用.所以,下面的内容会只围绕Macaca的iOS部分. 二. Mac ...

  2. IOS 入门开发之创建标题栏UINavigationBar的使用(二)

    IOS 入门开发之创建标题栏UINavigationBar的使用 http://xys289187120.blog.51cto.com/3361352/685746     IOS 开发有关界面的东西 ...

  3. IOS 入门开发之创建标题栏UINavigationBar的使用

    转自:http://xys289187120.blog.51cto.com/3361352/685746 IOS 入门开发之创建标题栏UINavigationBar的使用     IOS 开发有关界面 ...

  4. 2017-04-26 ios ipv6那些事(已完美解决)

    2017-04-26 ios ipv6那些事(已完美解决)   工作单位性质属于外包公司,每天都有几十的app要提交上传至应用市场,于2017年3月份接到ios工程师反馈 Guideline 2.1 ...

  5. iOS入门怎样选择Swift和objective-c

    版权声明:本文为博主原创文章,未经博主同意不得转载.博主微信:lofocus https://blog.csdn.net/cuibo1123/article/details/28261795 学oc吧 ...

  6. iOS入门及ObjC语法

    iOS入门:http://www.jonathanhui.com/ios ObjC语法: http://www.jonathanhui.com/objective-c https://github.c ...

  7. IOS入门之Swift语言(一)

    经过不断的努力,小哥也买了台苹果设备,终于可以开始我的IOS之旅了,说来确实令人苦恼,为了学习IOS我这着贫农阶级,省了几个月的零花钱,外加向亲朋好友求救,最终痛下心扉,卖了台MAC pro128G版 ...

  8. [转载]ios入门篇 -hello Word(1)

    温馨提示:,如果您使用移动终端阅读本篇文章,请连接wifi的情况下阅读,里面有大量图片,以免造成您不必要的损失.   潜水博客园很多年,闲来无事,聊一下自己的经历,语文不好(如有什么错别字,请您在下评 ...

  9. 记录IOS入门的过程

    先说点私话.再进入正题吧,顺便抒发下情绪.公司传统业务不景气,而互联网正如火如荼,无奈被逼上梁山.開始学起了IOS编程.后来想想闲着也是闲着就学习学习呗.无奈公司确实不希望投入了.不愿意提供苹果电脑. ...

随机推荐

  1. CSV的导入导出

    using System; using System.Data; using System.IO; namespace COMMON { public class CSVhelperClass { / ...

  2. Hibernate+jsp+struts+spring做增删该查,

    同样还是web项目,这里只做了一张表,做一个测试,例子.主要是建Hibernate 的时候要非常注意,有时间了整理一下建Hiberbnate 的时候需要注意的事项 这里我是建了5个包,其实只要四个就好 ...

  3. Fiddler 工作原理

    Fiddler工作原理: 就在在客户端与服务器端创建一个代理服务器: 在开启Fiddler后,Fiddler会自动窜改浏览器的代理,例如我们打开Fiddler,打开IE浏览器--设置--Interne ...

  4. CentOS 7下设置DNS服务器

    在CentOS 7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.和CentOS 6下的设置DNS方法不同,有几种方式: 1.使用全新的命令行工具 ...

  5. Java程序,猜大小游戏

    一个骰子,通常有1.2.3.4.5.6等6种点数.我们将1.2.3记作“小”,将4.5.6记作“大”.猜中显示“猜对了”,猜错记作“猜错了”之类的字样.本程序可以用Java实现. import jav ...

  6. 如何牢记C/C++中const的用法?

    (下面以 typename 表示C/C++内某一类型 我常常会搞混 const 放在 typename* 的前面和后面的区别,今天特地查看了它们两个各自的含义,总结了一下: const typenam ...

  7. FMDB浅析

    一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQLite的API进行了封装,加上了面向对象的思想,让我们不必使用繁琐的C语言API函数,比起直接操作SQLite更加方便. FMDB优 ...

  8. IOS XIB Cell自适应高度实现

    1.代码实现Cell高度自适应的方法 通过代码来实现,需要计算每个控件的高度,之后获取一个cell的 总高度,比较常见的是通过lable的文本计算需要的高度. CGSize labelsize = [ ...

  9. 神经网络hopfield的学习

    Hopfield神经网络使用说明. 该神经网络有两个特点: 1,输出值只有0,1 2,Hopfield没有输入(input) 这里解释一下第二个特点,什么叫没有输入?因为在使用Hopfield网络的时 ...

  10. H 1022 Train Problem Ⅰ

    题意:给我们两个序列,看能否通过压栈,出栈将第一个序列转换成第二个. 思路:将序列 1 依次压栈,同时看是否和序列 2 当前元素相同 代码如下: #include<iostream> #i ...