使用Zombie.js進(jìn)行Web自動(dòng)化測(cè)試

Zombie.js 是一個(gè)node.js環(huán)境下轻抱,非常小巧高效率的Web UI Automation Test庫(kù).本文將介紹如何使用Zombie.js對(duì)Web UI進(jìn)行自動(dòng)化測(cè)試.

本文使用到的環(huán)境:

快速預(yù)覽Zombie.js測(cè)試

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適用場(chǎng)景

好的方面

Zombie.js與傳統(tǒng)的Selenium和PhandomJS不同,它不會(huì)啟動(dòng)真正的瀏覽器评汰,使得測(cè)試運(yùn)行效率媲美單元測(cè)試梧躺。 Zombile.js默認(rèn)采用mocha風(fēng)格編寫(xiě)測(cè)試栓袖,無(wú)需再為WebDriver做額外的配置,如果你熟悉mocha, Zombie.js將是開(kāi)箱即用的庫(kù).

Features

  • 模擬瀏覽器行為
  • Assertions, 可以采用jQuery的Selector對(duì)dom進(jìn)行assert
  • Cookies
  • Ajax & WebSocket

限制

由于Zombie.js沒(méi)有真正啟動(dòng)傳統(tǒng)的WebDriver, 因此過(guò)于復(fù)雜的場(chǎng)景將會(huì)無(wú)法測(cè)試. 例如时捌,如何對(duì)高德地圖經(jīng)測(cè)試,我還沒(méi)有找到好的方法.

安裝Zombie.js

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

由于本文使用coffeescript代替javascript, 還需要安裝coffeescript環(huán)境

npm install -g coffee-script

編寫(xiě)第一個(gè)測(cè)試

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', '#')

運(yùn)行測(cè)試:

  1. 開(kāi)啟你的web server
  2. 運(yùn)行測(cè)試
mocha --harmony --compilers coffee:coffee-script/register login_spec.coffee

由于Zombie.js使用到了ECMA 6,需要使用 --harmony 參數(shù)開(kāi)啟 node.js 對(duì)ECMA 6語(yǔ)法支持.

使用Gulp.js構(gòu)建Build Pipeline

通常我們會(huì)講自動(dòng)化測(cè)試加入到build pipeline中. 這里將介紹將 Express.js + Zombie.js + gulp.js的配置方法.

Build pipeline策略

  1. checkstyle, 檢查代碼格式
  2. 運(yùn)行unit test
  3. compile coffeescript -> javascript
  4. 啟動(dòng)server
  5. 運(yùn)行automation test
  6. 出錯(cuò)或者結(jié)束測(cè)試,停止server

由于gulp-develop-server無(wú)法用coffeescript啟動(dòng)server,所以需要添加compile步驟.

express.js項(xiàng)目結(jié)構(gòu)組織

├── acceptence-test // automation test代碼
│   ├── admin_spec.coffee
│   └── login_spec.coffee
├── app //后臺(tái)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: 用于啟動(dòng)node.js connect based Web Server
  • gulp-sync: 用于同步運(yùn)行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'

運(yùn)行測(cè)試

gulp test:ui

運(yùn)行結(jié)果

[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)

由于已經(jīng)將test:ui加入到default task中. 直接運(yùn)行 gulp 便可運(yùn)行所有測(cè)試.

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末世舰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子槽卫,更是在濱河造成了極大的恐慌冯乘,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晒夹,死亡現(xiàn)場(chǎng)離奇詭異裆馒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丐怯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)喷好,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人读跷,你說(shuō)我怎么就攤上這事梗搅。” “怎么了效览?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵无切,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丐枉,道長(zhǎng)哆键,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任瘦锹,我火速辦了婚禮籍嘹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弯院。我一直安慰自己辱士,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布听绳。 她就那樣靜靜地躺著颂碘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椅挣。 梳的紋絲不亂的頭發(fā)上头岔,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音贴妻,去河邊找鬼切油。 笑死,一個(gè)胖子當(dāng)著我的面吹牛名惩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孕荠,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娩鹉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼攻谁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弯予,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤戚宦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后锈嫩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體受楼,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年呼寸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艳汽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对雪,死狀恐怖河狐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑟捣,我是刑警寧澤馋艺,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站迈套,受9級(jí)特大地震影響捐祠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑李,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一雏赦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芙扎,春花似錦星岗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至圈浇,卻和暖如春寥掐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磷蜀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工召耘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褐隆。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓污它,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衫贬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 本文默認(rèn)你已經(jīng)安裝好node環(huán)境德澈,并且熟悉node命令,和window cd命令固惯。 gulp簡(jiǎn)介 基于nod...
    9I閱讀 1,983評(píng)論 4 50
  • 原文鏈接:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutor...
    butterflyq閱讀 1,990評(píng)論 1 3
  • 對(duì)網(wǎng)站資源進(jìn)行優(yōu)化梆造,并使用不同瀏覽器測(cè)試并不是網(wǎng)站設(shè)計(jì)過(guò)程中最有意思的部分,但是這個(gè)過(guò)程中的很多重復(fù)的任務(wù)能夠使用...
    懵逼js閱讀 1,067評(píng)論 0 8
  • 編輯于2015年 轉(zhuǎn)載自某作者的譯文 作者要是看到請(qǐng)聯(lián)系我注明出處 對(duì)網(wǎng)站資源進(jìn)行優(yōu)化葬毫,并使用不同瀏覽器測(cè)試并不是...
    krock01閱讀 448評(píng)論 0 2
  • 在現(xiàn)在的前端開(kāi)發(fā)中镇辉,前后端分離、模塊化開(kāi)發(fā)贴捡、版本控制忽肛、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開(kāi)始...
    Charlot閱讀 5,439評(píng)論 1 32