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. iOS入门指引系列(零)

    俗话说的是,万事开头难. 意思是开了头,再把一件事办下去就没有那么难了. 我相信每一个人当想入门一项新技能的时候都有这样的体会吧.特别是现在网络上各式各样的学习资料,文章,这些零星的资料反而让初学者迷 ...

  2. iOS 入门——Hello World app

    iOS 入门--Hello World app 作为Mac重度使用者以及iOS小白一枚(匿),我将为iOS 10 构建我们的第一个iOS应用程序 (著名的"Hello World" ...

  3. IOS入门学习视频教程

    百度网盘:https://pan.baidu.com/s/1Ag2G-Fjyj6PMsTOLXRG0Ig 内容: 第一阶段:语言基础和iOS入门 iOS8 App开发快速入门 iOS开发语言 swif ...

  4. iOS入门、还是老手,都是值得收藏的一个资源文档

    这里写自定义目录标题 SwiftUI 资源 学习架构/模式相关开源框架 代码质量检查框架/工具 马上过年了,可以利用年假期间学习一下:对于老手来说,本文排版也可以优化,为了方便,对于github开源项 ...

  5. Macaca简单入门

    执行Macaca自动化脚本时,首先需要启动一个Macaca服务器: $ macaca server --verbose 参数设置 启动Macaca服务器时如果没有指定端口号,服务器URL的配置参数如下 ...

  6. iOS 入门开发踩坑实录

    其实人生也没有什么道理可讲,但是我们不必丧气,还是要期待,人生有奇遇. 前言 苹果开发者:iOS Developer 最近因为工作需要要开始搞iOS了,简单记录下我收集和学习的过程. 学习资料准备 组 ...

  7. IOS入门开发大概课程内容记录

    达内课程体系 第一阶段.Web开发基础(Linux操作系统.Nigix.XHTML技术核心.CSS技术核心):课程持续3周共96课时. 模块 课程目标 内容 项目 1 Mac Fundamental ...

  8. Wireshark抓包iOS入门教程

    本文来自简书,原文地址:http://www.jianshu.com/p/c67baf5fce6d 网络抓包是个基础技能,对于网络协议的掌握有一定的要求.iOS上实现网络抓包可以用Charles(针对 ...

  9. iOS开发那些事-故事板实现标签导航

    故事板实现标签导航 用故事板技术实现标签导航模式. 使用"Tabbed Application"模版,创建一个名为 "TabNavigationStoryborad&qu ...

最新文章

  1. 在idea使用maven工程建立web项目时,启动Tomcat访问不到项目首页。
  2. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
  3. sql insert and update
  4. 前端学习(2634):修改webstrom颜色
  5. 代码获取DEP按钮及获取DEP控件
  6. linux卸载amd软件命令,ubuntu如何卸载软件,Ubuntu软件安装和卸载
  7. VirtualBox虚拟机几种网络连接方式介绍
  8. 如何把阿拉伯数字转换为中文大写?
  9. ios根据服务器修改App名称,iOS 修改APP 名称
  10. 基于java的毕业设计选题系统的设计与实现
  11. 基于Pytorch的猫狗分类
  12. 【ArnoldC4D】1.ArnoldToC4D_基本概念及原理(sampling_and_camera_sampl)
  13. 基于机智云物联网平台的太阳能热水器控制系统
  14. 【Unity】旋转Vector3和Quaternion
  15. win7单机计算机就可打开,月影传说单机版电脑版
  16. DOM DOM概述
  17. 动力电池管理系统(BMS)策略与开发方法
  18. vba 选中所有区域 但是不包括首行
  19. java编译成功,但运行失败,即错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException:
  20. UC-Android逆向工程师 面试题1的分析

热门文章

  1. GitHub热榜第四!这套Python机器学习课,免费获取还易吸收 | 资源
  2. 揭秘2018图灵奖评选:Jeff Dean李开复和Lecun写信推荐Hinton
  3. 数据库开源 | 200人中英文混说数据库开放申请
  4. 出门问问发布无线智能耳机,李志飞:语音交互的下一个爆点
  5. 哈萨比斯首次解读AlphaZero竟被当场diss,他起身当面回击说…
  6. SQL系列(五)—— 排序(order by)
  7. 苹果收购法国图像识别公司 技术或植入iPhone
  8. zabbix的trigger
  9. $.ajax和$.post的区别(前者根据key-value/后者根据形参)
  10. MariaDB数据库介绍之一、备份(mysqldump、lvm2快照、xtrabackup)