跨页测试###

跨页测试更有挑战性,因为需要你控制和观测浏览器。

现在设置一个跨页测试情境的例子。比如,你的网站上有一个包含联系表单的Request Group Rate页面。营销部门想知道客户是从哪个页面点击链接进入Request Group Rate页面的,他们想知道客户是否在查看胡德河之旅或者俄勒冈海岸退潮。关联上它需要有一些隐藏的表单域和JavaScript,并且测试将会涉及进入一个页面,然后点击Request Group Rate并验证隐藏域是否正确填充了。

  • 首先创建一个旅游线路的页面:views/tours/hood-river.handlebars:
<h1>Hood River Tour</h1>
<a class="requestGroupRate"
href="/tours/request-group-rate">Request Group Rate.
</a>
  • 一个引用页面,views/tours/request-group-rate.handlebars:
<h1>Request Group Rate</h1>
<form>
<input type="hidden" name="referrer">
Name: <input type="text" id="fieldName" name="name"><br>
Group size: <input type="text" name="groupSize"><br>
Email: <input type="email" name="email"><br>
<input type="submit" value="Submit">
</form>
<script>
$(document).ready(function(){
$('input[name="referrer"]').val(document.referrer);
});
</script>
  • 在meadowlark.js中为这些页面创建路由:
app.get('/tours/hood-river', function(req, res){
res.render('tours/hood-river');
});
app.get('/tours/request-group-rate', function(req, res){
res.render('tours/request-group-rate');
});

要测试这个功能,需要一个浏览器,或者非常类似浏览器的东西;手动太麻烦了,我们希望它可以自动完成;目前有三种流行的解决方案:Selenium、PhantomJS和Zombie。

 * Selenium: 超级健壮,有丰富的测试支持,但配置较复杂
* PhantomJS:确实提供了一个非客户端Webkit浏览器(跟Chrome和Safari用的是相同的引擎),所以跟Selenium一样,它也呈现出了非常高水平的现实性。然而它还没提供我们所需的简单的测试断言
* Zombie:没有使用已有的浏览器引擎,所以它不适合用来测试浏览器的功能特性,但用它来测试基本功能是非常好的; 但目前不支持window;
  • 装Zombie: npm install --save-dev zombie

  • 创建一个新目录,简单地称其为qa(跟public/qa区分开)。在这个目录下创建qa/tests-crosspage.js文件:

var Browser = require('zombie');
var assert = require('chai').assert;
var browser; suite('Cross-Page Tests', function() {
setup(function() {
browser = new Browser();
});
test('requesting a group rate quote from the hood river tour page' +
'should populate the referrer field', function(done) {
var referrer = 'http://localhost:3000/tours/hood-river';
browser.visit(referrer, function(){
browser.clickLink('.requestGroupRate', function(){
assert(browser.field('referrer').value === referrer);
done();
});
});
});
test('requesting a group rate from the oregon coast tour page should ' +
'populate the referrer field', function(done){
var referrer = 'http://localhost:3000/tours/oregon-coast';
browser.visit(referrer, function(){
browser.clickLink('.requestGroupRate', function(){
assert(browser.field('referrer').value === referrer);
done();
});
});
});
test('visiting the "request group rate" page dirctly should result ' +
'in an empty referrer field', function(done){
browser.visit('http://localhost:3000/tours/request-group-rate',
function(){
assert(browser.field('referrer').value === '');
done();
});
});
});

setup的参数是一个函数,测试框架运行每个测试之前都会执行它,我们在这里为每个测试创建一个新的浏览器实例。

这里有三个测试。前两个检查如果你来自产品页面,引用页是否正确。方法browser.visit会真正加载页面,页面加载完成后,就会调用回调函数。然后用方法browser.clickLink找到class为requestGroupRate的链接,并访问它。链接目标页面加载完后调用回调函数,我们就到了Request Group Rate页面上。剩下唯一要做的就是断言隐藏域referrer跟我们原来访问的页面是匹配的。browser.field方法会返回 一个DOM元素对象,具有value属性。最后一个测试只是确保直接访问Request Group Rate页面时referrer为空。

在进行测试之前,必须先启动服务器node meadowlark.js。应该在另一个窗口中启动它,以便看到控制台错误。然后,运行测试看看我们做得怎么样(确保你有全局安装的Mocha:npm install -g mocha):

mocha -u tdd -R spec qa/tests-crosspage.js 2>/dev/null

注意前面那个命令,我们用的是TDD界面(默认是BDD),还用了一个叫spec的报告。spec报告比默认报告提供的信息要多一些。(等你有上百个测试的时候,你可能还是想用默认报告。)最后,你可能会注意到我们扔掉了错误输出(2>/dev/null)。Mocha会报告失败测试的全部堆栈跟踪。这些信息可能有用,但一般你只想看到哪些测试通过了,哪些失败了。如果你需要更多信息,去掉2>/dev/null就能看到错误的细节了。

上面的例子有错误####

逻辑测试###

用Mocha做逻辑测试; 现在只有一个小小的功能,所以设置它相当容易。另外,因为只有一个组件,也不能做集成测试,所以只添加单元测试。

  • 创建文件qa/tests-unit.js:
var fortune = require('../lib/fortune.js');
var expect = require('chai').expect; suite('Fortune cookie tests', function() {
test('getFortune() should return a fortune', function() {
expect(typeof fortune.getFortune() === 'string');
});
});
  • 运行Mocha来进行这个新的测试集:

    mocha -u tdd -R spec qa/tests-unit.js

去毛###

最早的JavaScript去毛机是Douglas Crockford的JSLint; 此外Anton Kovalyov在2011年创建了JSLint的分支,于是JSHint诞生了。后者比前者更灵活

  • 安装:npm install -g jshint
  • 运行,只要指定源文件名调用它就可以了:`jshint meadowlark.js`

用Gulp实现自动化###

持续集成###

基本上你每次向共享服务器贡献代码时,CI(持续集成)都会运行部分或全部测试。如果所有测试都通过了,通常什么也不会发生。另一方面,如果有测试失败了,后果一般是更加公开。这也是取决于你是如何配置CI的,但一般整个团队都会收到一封邮件说你“搞砸了构建”。

目前Node中最流行的CI服务器是Travis CI;此外还有Jenkins,TeamCity

express-5 质量保证(2)的更多相关文章

  1. express-4 质量保证(1)

    QA 在Web开发中,质量可以分解为四个维度: 到达率: 到达率是指产品的市场普及程度,即查看网站或使用服务的人数.到达率和盈利能力是正相关关系:访问网站的人越多,购买产品或服务的人就越多.从开发的角 ...

  2. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  3. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

  4. Express 教程 01 - 入门教程之经典的Hello World

    目录: 前言 一.Express?纳尼?! 二.开始前的准备工作 三.测试安装之经典的Hello World 四.使用express(1)来生成一个应用程序 五.说明 前言: 本篇文章是建立在Node ...

  5. VisualStudio 2015 开启IIS Express可以调试X64项目

    现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢.   如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...

  6. Node.js Express连接mysql完整的登陆注册系统(windows)

    windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...

  7. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

  8. express全局安装后无法通过require使用

    今天入门了一下express,首先安装依赖. npm install express -g; npm install body-parser -g; npm install cookie-parser ...

  9. 初步认识Node 之Express

    通过本文,你会对Express有一个较为具体的了解.    起源 2009年6月26日,TJ Holowaychuk提交了Express的第一次commit,接下来在2010年1月2日,有660次co ...

随机推荐

  1. rsync使用

    1)拷贝本地文件.当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式.     如:rsync -a  ./test.c  /backup 2)使用一个远程 ...

  2. storyboard pushViewController 的时候,新的界面黑屏

    storyboard 创建的一级界面需要通过代码跳转到另一 storyboard 创建的界面的时候,通常我们会这样 其实 alloc init 相当于重新创建一个界面,所以我们 push 进入之后会发 ...

  3. October 1st 2016 Week 40th Saturday

    Autumn, the year's last, loveliest smile. 秋,四季流转中的最后一抹,也是最美的那一抹微笑. I love autumn because it is the h ...

  4. volatile和const

    volatile可理解为“编译器警告指示字” volatile用于告诉编译器必须每次去内存中取变量值 volatile主要修饰可能被多个线程访问的变量 volatile也可以修饰可能被未知因数更改的变 ...

  5. NYOJ题目124中位数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAAJUCAIAAABsWvwaAAAgAElEQVR4nO3dPXLjuraG4TsJ5xqIYw

  6. NYOJ题目596谁是最好的Coder

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAscAAAMaCAIAAADlQ3w8AAAgAElEQVR4nO3dO3LbvN4H4G8T7r2Q1F

  7. Asp.Net - 9.socket(聊天室)

    9.1 Socket相关概念 IP地址 每台联网的电脑都有一个唯一的IP地址. 长度32位,分为四段,每段8位,用十进制数字表示,每段范围 0 ~ 255 特殊IP:127.0.0.1 用户本地网卡测 ...

  8. 数据库递归查询-CTE

    1.公用表表达式(CTE)的定义 公用表达式的定义包含三部分: 公用表表达式的名字(在WITH之后) 所涉及的列名(可选) 一个SELECT语句(紧跟AS之后), 公用表表达式的好处之一是可以在接下来 ...

  9. 湘潭邀请赛 Hamiltonian Path

    湘潭邀请赛的C题,哈密顿路径,边为有向且给定的所有边起点小于终点,怎么感觉是脑筋急转弯? 以后一定要牢记思维活跃一点,把复杂的事情尽量简单化而不是简单的事情复杂化. #include<cstdi ...

  10. supervisor使用

    supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启. 根据服务器上的python ...