日期:2014-05-16  浏览次数:20345 次

用node.js建博客(五) - 用vows以BDD方式测试程序

BDD? 行为测试驱动开发,先用BDD测试工具描述用户行为,然后测试结果。这种方式更容易贴近需求。核心思想,描述故事,验证结果。

这里说BDD估计有点标题党的嫌疑,因为没有打算大篇幅说BDD, 况且自己也没有这方面的经验。下来只谈,如何在node.js中使用BDD开发库 - vows

?

node.js中流行的测试库:

  • TDD: expresso?(express 作者写的测试库)
  • BDD: vows (vows.org 网站被墙,天朝V5....)
  • api-easy (基于vows, 简化了vows使用方式, 主要面向REST-ful API的测试)

这里我不打算直接使用vows, api-easy的方式会更让人赏心悦目;

?

安装程序:

1. 安装vows:

$ npm install vows -g

这里需要加 "-g" 参数将其安装成globle, vows提供了commandline工具,用于执行测试, e.g:

$ vows test/*-test.js --spec

?

关于是否加"-g"参数,这里有个规则,如果开发包中提供了 bin 目录, 在安装的时候最好加上 "-g" 参数.

2. 安装api-easy:

修改package.json:

?

{
    "name": "nodeblog"
  , "version": "0.0.5"
  , "private": true
  , "dependencies": {
      "express": "2.4.6"
    , "jade": ">= 0.0.1"
    , "markdown-js": ">= 0.0.1"
    
  }
  , "devDependencies": {
      "api-easy": "0.2.x"
    , "vows": "0.5.x"
  }
  , "scripts": {
      "test": "vows test/*-test.js "
  }
  , "engines": {
      "node": ">= 0.4.5"
  }
}

scripts 标签中定义的test可以使用 npm test 来运行.  使用vows 运行test目录下的测试用例

?

安装依赖:

$ npm install

$ npm test

?

编写测试:

在测试之前首先要确定要测试什么。

  • ?
    • 访问项目首页,应该返回index.jade
    • 访问blogs/first.html应该返回markup页面(当然,first.md在之前已经存在)
    • 访问blogs/not_exists.html应该返回404页面

构建第一个测试

1. 构建测试目录:

$?mkdir test


2. 为test/page-test.js添加测试代码:

?

测试首页是否存在,如果存在则返回200 statusCode, express程序还会返回一个特殊的header

?

var vows = require('vows');
var apiEasy = require('api-easy');
var assert = require('assert');


var suite = apiEasy.describe('/');

suite.discuss("when visit home page")
    .discuss('can view blog list and it should response 200 status')
    .use('localhost', 3000)
    .setHeader('Content-Type', 'text/html; charset=utf-8')
    .get()
        .expect(200)
        .expect("should respond with x-powered-by",
            function(err, res, body) {
                // express
                assert.include(res.headers, 'x-powered-by');
            })
    .export(module);

?

其中

  • apiEasy.describe(string) 用来创建vows测试Suit, 以后的所有测试都基于这个suit?
  • assert 是 node.js 的标准模块