`
witcheryne
  • 浏览: 1100286 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

    博客分类:
  • node
阅读更多

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 的标准模块
  • vows 是 api-easy 的核心,api-easy只是对vows进行了一次封装,使其便于测试REST应用

$ node app.js #启动app

$ node test #测试...

 

 

3. 添加一个fail的测试:

 

    .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');
            })
        .expect(404)
    .export(module);

 

此时可以看到如下结果


 

从这里可以看出, discuss 方法用来描述一件故事,如果多个discuss连用,则会将描述链接起来

 

再来测试一个最核心的问题:

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

1. 新建一个 test/blogs-test.js 文件,添加如下代码:

 

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

var suit = apiEasy.describe("/blogs/*.html")

suit.discuss('when vists the markdown blog,')
    .use('localhost', 3000)
        .setHeader('Content-Type', 'text/html; charset=utf-8')
        .path('/blogs/')
        
    .discuss('if the markdown file is exists')
        .get('first.html')
            .expect(200)
    
    .undiscuss()    
    .discuss('if the markdown file is not exists')
       .get('unknow.html')
            .expect(404)
    
    .export(module);

$ npm test

 

你妹!! 应该存在啊!! 之前有测试过,估计是我改了什么环境。

检查代码, 发现了问题所在,

 

app.get('/blogs/:title.html', function(req, res, next) {
    
    var urlPath = [
        'blogs/',
        req.params.title, '.md'
    ].join('');

    
    var filePath = path.normalize('./' + urlPath);
    // path exists 不认相对路径
    path.exists(filePath, function  (exists) {

 

  看了看文档,需要使用 process.cwd() 来获取当前进程所在路径:

 

app.get('/blogs/:title.html', function(req, res, next) {
    
    var urlPath = [
        // 获取相对路径, 我的应该是: 
        // /Users/lvjian/projects/nodejs/nodeblog
        process.cwd(),
        '/views/blogs/',
        req.params.title, '.md'
    ].join('');

    var filePath = path.normalize(urlPath);
    
    path.exists(filePath, function  (exists) {
        console.log(exists);
        
        if(!exists) {
            next();
        } else {
            res.render(urlPath, {layout: false});
        }
    });

})

 ok~ test again:

$ node app.js #启动 app

$ npm test


 

现有测试还欠缺什么?

 

  • 每次测试时都需要手动启动app, 没有自动启动的脚本.(node.js 中有个叫Jake 的东西,名称山寨ruby中的Rake)
  • 测试只比对了response.statusCode, 没有对内容进行验证
  • 没有自动测试的工具,错误反馈太慢

 

What's next?

解决测试方式的不足? o~ no ...  我要保持简单,那些暂时不需要,这些只会让我钻技术的牛角尖。下来我打算开始干点轻松的事情

 

  • 加入css美化页面, 这里我打算采用Blueprint css framework
  • 将google-code-pretty加入程序,提供代码高亮功能
  • 有灵感的话,在为nodeblog设计一个Logo

 

参考资料:

  • 大小: 18.3 KB
1
2
分享到:
评论
1 楼 yiqianke 2013-01-04  
前面已经捕捉了404的问题了。应该返回的是200,所以测试用例也应该是200

相关推荐

    Node.js-node.js的异步BDD和持续测试

    在Node.js中,我们可以使用BDD风格的测试框架,如Vows,来编写异步测试。Vows是一个强大的测试库,它支持BDD模式,允许开发者用自然语言描述测试场景和预期结果。 异步测试在Node.js中尤为重要,因为许多操作如文件...

    MongoDB+NodeJS持续集成

    通过本文介绍的知识点,我们可以理解在Node.js项目中设置持续集成的基本步骤,包括定义测试套件、选择合适的测试运行器和断言库,以及使用Mocha和ChaiJS创建和运行测试。 构建这种集成的实践,可以显著降低软件缺陷...

    grunt-vows:运行誓言测试规范的繁重任务

    安装npm install grunt-vows用法通过 grunt 运行它,首先将这一行添加到项目的grunt.js gruntfile 中: grunt . loadNpmTasks ( "grunt-vows" ) ; 然后直接(或通过别名)运行vows任务: grunt vows 或者您可以将其...

    誓言:Node.js的异步BDD和连续测试

    vows是NodeJS的测试框架。 执照 版权所有2016-2018 Fuzzy.ai 版权2017 AJ乔丹 根据Apache许可版本2.0(“许可”)许可; 除非遵守许可,否则不得使用此文件。 您可以在以下位置获得许可的副本: 除非适用法律...

    gulp-vows:Gulp插件,用于运行vows.js测试

    吞噬vows.js的基本gulp插件,依靠vows的测试运行程序。选项gulp-vows带有一个带有以下选项的options对象options.runner 字符串:誓言的习惯报告者的名称。 之一: 点矩阵(默认) 规格json 轻敲苗条的记者:options....

    javascript-test-beispiele:使用vows.js,Jasmine和Qunit在JavaScript中进行测试的示例

    JavaScript测试示例 在这个小项目中,我收集了一些小示例以进行JavaScript测试。 包含以下框架的示例: vows.js 茉莉花 QUnit 塞巴斯蒂安·桑尼茨(Sebastian Sanitz)

    node-pingdom:Node.js 的 Pingdom JSON API 访问模块

    测试使用,可以作为vows test/test_pingdom_api.js运行。 请注意,要运行测试套件,您必须在此存储库的根目录中创建一个 credentials.json 文件。 该文件的格式应如下所示: { "username" : "myusername@mydomain...

    bleach:node.js 的简约 HTML 消毒剂

    安装 npm install bleach测试 vows --spec test/*例子基本的: var bleach = require ( 'bleach' ) ;var html = bleach . sanitize ( aBunchOfHTML ) ;console . log ( html ) ; 先进的: var bleach = require ( '...

    cakes:蛋糕文件的集合,主要是试图学习这个很酷的东西

    蛋糕 蛋糕文件的集合,主要是试图学习 安装 在此仓库的根目录中,运行 npm install 它将获得package.json文件中定义的依赖项(它们相当多,可能要花一些时间) ...vows@0.5.11 ./node_modules/vows

    vowsjs.org:wowsjs 的公共网站

    Vows.js 是一个基于事件驱动的 JavaScript 测试框架,它为开发者提供了一种优雅的方式来组织和执行测试。这个“vowsjs.org”是 Vows.js 的官方网站源代码,主要用于展示项目信息、文档和示例。从给定的标签“CSS”...

    前端开源库-cross-os

    "build": "os:node build.js", "test": "os-unix:vows --spec test/*_test.js" } } ``` 在上面的例子中,`build`命令会在所有操作系统上运行,而`test`命令则只在Unix-like系统(如Linux和macOS)上运行。 四、...

    PyPI 官网下载 | tornado_pyvows-0.6.0.tar.gz

    `pyvows`则是另一个Python测试框架,它基于Vows.js的理念,提供了一种声明式的方式来编写异步测试。PyVows允许开发者通过定义预期(expectations)来组织测试,这些预期在测试执行过程中会被自动检查。这使得测试...

    PyPI 官网下载 | tornado_pyvows-0.5.2.tar.gz

    PyVows,另一方面,是一个Python的测试框架,它基于Vows.js的思想,提供了一种声明式的、基于上下文的测试方法。PyVows允许开发者以一种更加可读和组织良好的方式编写测试代码,通过上下文和预期来组织测试用例,...

    fight-game:格斗游戏

    所需模块为了在您的机器上运行该项目,您需要使用npm安装这些模块: express socket.io nodemon (使用npm install -g全局npm install -g ) browserify gulp gulp-uglify vinyl-transform vows karma-cli (使用npm...

    mithril-scratchpad:一个受Ghost启发的简单的平面文件笔记应用程序

    测试是使用vows构建的。 确保已安装vows以运行任何提供的测试: npm install -g vows 运行npm test以运行可用的测试套件。 执照 The MIT License (MIT) Copyright (c) 2015 Seth Benjamin Permission is hereby ...

    PluralSightGruntTutorial:PluralSight Grunt 教程可帮助为我的个人网站设置 Grunt Boiler Plate

    { "module-name": "./bin/module-name" }, "scripts": { "test": "vows --spec --isolate", "start": "节点索引.js", "predeploy": "echo im about to deploy", "postdeploy": "echo ive deploy", "prepublish": ...

    xqlint:JSONiq和XQuery质量检查器

    为您的系统(Mac,Windows或Linux)安装Node.js和NPM。 并使用以下命令安装命令行工具: $ npm install xqlint -g 用法 皮棉 $ xqlint lint < path> [-s, --style-check < yes> ] 将AST打印为XML $ xqlint ast ...

    api-easy:流利的(即可链接的)语法,用于针对RESTful API生成誓言测试

    API易 一种流利的(即可链接的)语法,用于针对RESTful API生成誓言测试。 安装 安装npm(节点程序包管理器) ... 在上阅读此处(在“测试套件的结构”下),或者只记得vows使用以下语法结构: Suite → Batch* Batc

    OMG美语文字资料

    - **使用场景:** - 当你感到沮丧时:“Oh my gosh! I missed the bus again.” - 当你感到兴奋时:“OMG! We are going to the beach today!” - 当你感到失望时:“Oh my gosh! I just failed that test!” **...

Global site tag (gtag.js) - Google Analytics