使用Zombie.js进行Web自动化测试

Zombie.js 是一个node.js环境下,非常小巧高效率的Web UI Automation Test库.本文将介绍如何使用Zombie.js对Web UI进行自动化测试.

本文使用到的环境:

快速预览Zombie.js测试

const Browser = require('zombie');
Browser.localhost('example.com', 3000);
describe('User visits signup page', function() {

  const browser = new Browser();

  before(function(done) {
    browser.visit('/signup', done);
  });

  describe('submits form', function() {

    before(function(done) {
      browser
        .fill('email',    'zombie@underworld.dead')
        .fill('password', 'eat-the-living')
        .pressButton('Sign Me Up!', done);
    });

    it('should be successful', function() {
      browser.assert.success();
    });

    it('should see welcome page', function() {
      browser.assert.text('title', 'Welcome To Brains Depot');
    });
  });
});

Zombie.js适用场景

好的方面

Zombie.js与传统的Selenium和PhandomJS不同,它不会启动真正的浏览器,使得测试运行效率媲美单元测试。 Zombile.js默认采用mocha风格编写测试,无需再为WebDriver做额外的配置,如果你熟悉mocha, Zombie.js将是开箱即用的库.

Features

  • 模拟浏览器行为
  • Assertions, 可以采用jQuery的Selector对dom进行assert
  • Cookies
  • Ajax & WebSocket

限制

由于Zombie.js没有真正启动传统的WebDriver, 因此过于复杂的场景将会无法测试. 例如,如何对高德地图经测试,我还没有找到好的方法.

安装Zombie.js

npm install -g mocha
npm install zombie --save-dev

由于本文使用coffeescript代替javascript, 还需要安装coffeescript环境

npm install -g coffee-script

编写第一个测试

Brower = require 'zombie'

Brower.localhost('yourdomain.com', 5000)

describe 'User visits login page', () ->
  browser = new Brower()
  before (done) ->
    browser.visit '/login', done

  describe 'submits login form', () ->
    before (done) ->
      browser
      .fill 'username', 'xxxx@mail.com'
      .fill 'password', 'password'
      .pressButton('登录', done)

    it 'should be successful', () ->
      browser.assert.success()

    it 'should visit admin page', () ->
      browser.assert.url /^http:\/\/yourdomain\.com\/users\/\d\/admin/

    it 'should see profile button with email', () ->
      browser.assert.link('#profile-button', 'xxxx@mail.com', '#')

运行测试:

  1. 开启你的web server
  2. 运行测试
mocha --harmony --compilers coffee:coffee-script/register login_spec.coffee

由于Zombie.js使用到了ECMA 6,需要使用 --harmony 参数开启 node.jsECMA 6语法支持.

使用Gulp.js构建Build Pipeline

通常我们会讲自动化测试加入到build pipeline中. 这里将介绍将 Express.js + Zombie.js + gulp.js的配置方法.

Build pipeline策略

  1. checkstyle, 检查代码格式
  2. 运行unit test
  3. compile coffeescript -> javascript
  4. 启动server
  5. 运行automation test
  6. 出错或者结束测试,停止server

由于gulp-develop-server无法用coffeescript启动server,所以需要添加compile步骤.

express.js项目结构组织

├── acceptence-test // automation test代码
│   ├── admin_spec.coffee
│   └── login_spec.coffee
├── app //后台app代码 coffeescript
├── bin
├── config
├── dist //coffeescript编译后的js代码
├── gulpfile.coffee
├── gulpfile.js
├── node_modules
├── package.json
├── public
├── spec // unit test代码
│   ├── activities_spec.coffee
│   ├── auth_spec.coffee
│   └── projects_spec.coffee
└── views

安装依赖

npm install -g gulp
npm install gulp-mocha gulp-coffee gulp-coffeelint gulp-sync gulp-task-listing gulp-develop-server harmonize --save-dev
  • harmonize: 使gulp支持ECMA 6
  • gulp-develop-server: 用于启动node.js connect based Web Server
  • gulp-sync: 用于同步运行tasks
  • gulp-task-listing: 为gulp.js添加help支持, 可以列出gulpfile中的所有tasks.

配置gulpfile

require("harmonize")()
gulp = require 'gulp'
gulpsync = require('gulp-sync')(gulp)
server = require 'gulp-develop-server'

coffeelint = require 'gulp-coffeelint'
mocha = require 'gulp-mocha'
karma = require 'gulp-karma'
coffee = require 'gulp-coffee'
task_listing = require('gulp-task-listing')

gulp.task 'help', task_listing.withFilters null, 'sync'

gulp.task 'coffee:lint', ->
  gulp.src(['app/**/*.coffee', './*.coffee'])
    .pipe(coffeelint('config/coffeelint.json'))
    .pipe(coffeelint.reporter())
    .pipe(coffeelint.reporter('fail'))

gulp.task 'coffee:compile', ['coffee:lint'], ->
  gulp.src ['app.coffee', './app/**/*.coffee']
    .pipe coffee()
    .pipe gulp.dest('./dist')

gulp.task 'test:unit', ['coffee:lint'], ->
  gulp.src('spec/**/*.coffee')
    .pipe(mocha(reporter: 'spec'))


gulp.task 'test:ui', ['coffee:compile'],  ->
  server.listen path: './dist/app.js'
  gulp.src('acceptence-test/**/*.coffee')
    .pipe(mocha(reporter: 'spec'))
    .on 'error', () -> server.kill()
    .on 'end', () -> server.kill()

gulp.task 'test', gulpsync.sync(['test:unit', 'test:ui']), ->

gulp.task 'clean', ->
  console.log 'clean task...'

gulp.task 'default', ['clean'], ->
  gulp.start 'test'

运行测试

gulp test:ui

运行结果

[11:03:21] Starting 'coffee:lint'...
[11:03:22] Finished 'coffee:lint' after 184 ms
[11:03:22] Starting 'coffee:compile'...
[11:03:22] Finished 'coffee:compile' after 114 ms
[11:03:22] Starting 'test:ui'...
server listening on 5000
[11:03:22] Development server listening. (PID:6427)

  User visit admin projects page
    and has login
      when click profile button
        ✓ should see dropdown menu
        ✓ should see project admin item
        ✓ should see logout item
        when click project admin link
          ✓ should visit to admin page
        when click logout link
          ✓ should logout
          ✓ should redirect to login page

  User visits login page
    submits login form
      ✓ should be successful
      ✓ should visit admin page
      ✓ should see profile button with email


  9 passing (6s)

[11:03:28] Finished 'test:ui' after 6.08 s
[11:03:28] Development server was stopped. (PID:6427)

由于已经将test:ui加入到default task中. 直接运行 gulp 便可运行所有测试.

参考资料

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

推荐阅读更多精彩内容

  • 前言 本文默认你已经安装好node环境,并且熟悉node命令,和window cd命令。 gulp简介 基于nod...
    9I阅读 1,984评论 4 50
  • 原文链接:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutor...
    butterflyq阅读 1,990评论 1 3
  • 对网站资源进行优化,并使用不同浏览器测试并不是网站设计过程中最有意思的部分,但是这个过程中的很多重复的任务能够使用...
    懵逼js阅读 1,069评论 0 8
  • 编辑于2015年 转载自某作者的译文 作者要是看到请联系我注明出处 对网站资源进行优化,并使用不同浏览器测试并不是...
    krock01阅读 448评论 0 2
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,440评论 1 32