用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 的标准模块
  • 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

 

参考资料:

Node.js-node.js的异步BDD和持续测试 node.js的异步BDD和持续测试 立即下载

相关推荐

svn co --depth和svn up --set-depth 只check out下一层文件 只更新指定文件 只更新下一层的用法

svn的工程可能很大 有时我们只需要部分文件即可 这里介绍几个命令 1.svn co(check out) --depth --depth=empty,files,immediates,infinity 假设某svn结构如下 svn://root/PRO/A_dir/a svn://root/PRO/B_dir/b svn://root/PRO/c_file svn co --depth=emptysvn://root/PRO 此时只会在本地check out出 PRO/的空目录。 sv.

cy413026的博客 1万+

nodejs单元测试框架-mocha 和 断言库should.js(BDD风格:行为驱动开发)

官网 http://shouldjs.github.io/ github地址 https://github.com/tj/should.js 使用前先安装模块 npm install should --save–dev 安装完成后引入文件 require(‘should’) 异步测试 同步和异步的区别 https://blog.csdn.net/qq_35052627/article/de...

CallMeXiaoHuhuu 907

从零搭建基于OpenSpec的现代化UI自动化测试框架实战指南

UI自动化测试是软件质量保障的关键环节,其核心在于通过脚本模拟用户操作,对Web应用界面进行功能验证。其原理在于利用浏览器驱动工具(如Selenium、Playwright)提供的API,实现对页面元素的定位、交互与断言。一个设计良好的自动化框架能显著提升测试脚本的可维护性、可读性和执行稳定性,从而在持续集成、回归测试等场景中发挥巨大价值。本文聚焦于如何构建一个现代化的UI测试框架,通过整合OpenSpec架构规范、Pytest测试引擎与Playwright浏览器自动化工具,形成清晰的页面对象模型(POM)

weixin_28836989的博客 285

行为驱动开发(BDD)全面介绍

行为驱动开发(BDD)全面介绍 作者:杜铁绳  在软件行业中,软件研发项目软件产品交付经常被推迟、研发费用经常超出预算、经常遗漏客户所需的软件功能、有将近20%的项目最终无法交付,或者取消。这些软件研发往往花费了大量的资金、人力和时间,但所交付给用户的产品功能却有很大部分用户不会用到,或者没有能够帮助用户解决问题。 导致软件研发项目失败的原因是多种多样的,但最终结果可以分为两类: 没能...

AI 教你脱发代码,背锅指南,卷王沉默,摸鱼流泪! 2万+

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写

本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。

weixin_28726391的博客 442

BDD之单元测试(一):BDD出现的背景

目录 为什么要BDD? BDD是什么? BDD怎么做? BDD有什么好处? 什么样的项目适合BDD? 为什么要BDD? “开发软件系统最困难的部分就是准确说明开发什么” (“The hardest single part of building a software system is deciding precisely what to build” —No Silver Bullet, Fred Brooks) 。 场景一:业务分析人员觉得自己分析的需求已经写的很清晰了,并且跟技术人员.

蓝天之枫 2054

如何在项目中集成bpmn-process-designer

文章目录一、bpmn-process-designer是什么?二、使用步骤1.将下面地址的代码下载到本地2.替换dependencies和devDependencies3.拷贝package目录4.在main.js引入代码5.拷贝src5.拷贝App.vue代码注意事项 一、bpmn-process-designer是什么? bpmn-process-designer是一个基于 bpmn.js,Vue 2.x 和 ElementUI 开发的流程设计器(前端部分),支持监听器,扩展属性,表单等配置,可自由扩展

weixin_43550766的博客 9453

BDD测试利器:mocha+should.js

  众所周知对于任何一个项目来说,做好单元测试都是必不可少的一项工作。今天在逛CnodeJs社区的时候,无意中看到一篇介绍nodejs测试工具mocha的贴子。于是自己捣鼓了一阵之后,好像还蛮有趣的样子,因此把我摸索入门的过程记录下来跟大家分享一下:   1、准备工作   先新建一个项目文件夹,命名为simpleTest。   然后在simpleTest文件夹中创建一个名为test的文...

weixin_34081595的博客 265

J204B接口数据链路的建立

介绍J204B数据链路层的建立方式

QUACK_G的博客 6547

RK3568平台开发系列讲解(安卓篇)LED呼吸灯系统流程

1.app层封装后使用NotificationManager发出:NotificationManager.notify() 2.Android 系统架构中:一个manager类对应一个aidl接口,一个manager对应一个底层的服务,notification也是这个架构

内核笔记 3644

node.js入门甜点,使用node.js建静态博客

在学习node.js的过程中,顺便做了个静态博客,边写博客边编码,一段时间下来写了8篇文章。有点像学习笔记,最近作了汇总。 建成的博客地址(很简陋,请轻拍...) http://nodeblog.cloudfoundry.com/ 文章列表: 从文

lvjian700的博客 2310

数字孪生教程大全之 我们如何构建数字孪生?数字孪生的五个级别都是什么

文章摘要 什么是数字孪生? 我们如何构建数字孪生? 开发智能数字孪生系统的框架 什么是数字孪生? 数字孪生是一个不言自明的术语,用于识别物理系统的数字化版本。数字孪生的最早参考来自大卫·格伦特(David Gelernter )的小说作品。在他 1995 年的书中,Gelernter 博士为读者提供了未来有趣的可能性——万维网。前网络书籍谈到了计算机系统上的镜像数字世界。有些人可能会争辩说,我们的 Meta-verse 是新的数字世界——现实世界的数字孪生。但是,还有其他可能性,时间可能会讲述一个更好的

iCloudEnd的博客 3629

使用node.js建博客文章总汇

最近心血来潮,用node.js写了一个简单的markdown博客。 建这个博客时,编码,博客同时进行的,记录了整个学习和编写的过程,本片将相关文章做了汇总,方便查阅。 建成的博客的地址(很简单,请轻拍...): http://nodeblog.cloudfoundr...

chuifuhuo6864的博客 154

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

node.js

文章列表: 从文件上传开始, 进入node.js的世界 将使用npm管理的node.js项目部署到vCloudLabs 用node.js建博客(一) – node.js安装及Express框架简介 用node.js建博客(二) – 构建第一个markdown页面 用node.js建博客(三) – 用markdown写静态博客 用node.js建博客(四) –

Mchange的专栏 659

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

几篇不错的node.js的教程

文章列表: 从文件上传开始, 进入node.js的世界 将使用npm管理的node.js项目部署到vCloudLabs 用node.js建博客(一) – node.js安装及Express框架简介 用node.js建博客(二) – 构建第一个markdown页面 用node.js建博客(三) – 用markdown写静态博客 用node.js建博客(四) –

C860_zy的专栏 1326

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Nodejs实战 —— 测试 Node 程序

读 《node.js实战2.0》,进行学习记录总结。 当当网购买链接 豆瓣网1.0链接 测试 Node 程序 本章内容 用 Node 的 assert 模块测试 使用其他断言库 使用 Node 单元测试框架 用 Node 模拟并控制 Web 浏览器 在测试失败时获取更多的信息 添加到 程序中的功能越来越多,出现的 bug 的风险就越高。没经过测试的程序是不完整的,而手动测试既繁琐又容...

df8650171的博客 620

[转]关于TDD、BDD和DDD的一些看法

在实际的项目中,我们可能随时面对各种不同的需求,它的各个方面的要素决定了我们所采用的开发模式。 比如,它的复杂度如何?所有的需求是否足够清晰?开发人员对相关的业务是否足够了解?项目的工期是否合理?种种问题,不一而足。这也决定了我们可能面对不同的需求可能需要采用不同的开发模式。下面大概说几种。 1. TDD TDD指的是Test Drive Development,很明显的意思...

admi88888888的博客 810

测试Node.js 应用程序

在计算机编程中,单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。 程序的测试是每个开发人员必须要做的事情,这个事情我们不能全部交给测试人员。给应用程序编写

godbugs的专栏 692

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 326

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 316
上一篇: 用node.js建博客(四) - express中的404处理
下一篇: 分享一个SlideShare:《做卓有成效的程序员》
lvjian700
博客等级 码龄15年 14粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值