使用 Node.js 做 Function Test实现方法


Posted in Javascript onOctober 25, 2013

Info
上周 meeting 上同事说他们现在在用 java 写 function test,产生了很多冗余的代码,整个项目也变得比较臃肿。现在迫切需要个简单的模板项目能快速搭建function test。

后来我回去想了想,为什么我们非得用 java 来做 function test 呢?

Node.js 应该是个不错的选择,并且对 json 有着天然的支持,于是回去在 github 上随手一搜,还果真有相关的项目:testosterone,于是便有了这篇blog.

Server
要做demo,自然要有相应的server来支撑。

在这里我们选用Express作为server。

首先我们建立一个server的文件夹,新建package.json。

{
    "name": "wine-cellar",
    "description": "Wine Cellar Application",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "express": "3.x"
    }
}
 

接下来run command

npm install

这样express就装上了。

我们实现几个简单的 get post 方法来做实验

var express = require('express')
  , app = express();
app.use(express.bodyParser());
app.get('/hello', function(req, res) {
    res.send("hello world");
});
app.get('/', function (req, res) {
  setTimeout(function () {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end();
  }, 200);
});
app.get('/hi', function (req, res) {
  if (req.param('hello') !== undefined) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello!');
  } else {
    res.writeHead(500, {'Content-Type': 'text/plain'});
    res.end('use post instead');
  }
});
app.post('/hi', function (req, res) {
  setTimeout(function () {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(req.param('message') || 'message');
  }, 100);
});

app.get('/user', function(req, res) {
    res.send(
      [
        {name:'jack'}, 
        {name:'tom'}
      ]
    );
});
app.get('/user/:id', function(req, res) {
    res.send({
        id: 1, 
        name: "node js", 
        description: "I am node js"
    });
});
app.post('/user/edit', function (req, res) {
  setTimeout(function () {
    res.send({
      id:req.param('id'),
      status:1
    });
  }, 100);
}); 
app.listen(3000);
console.log('Listening on port 3000...');

testosterone
server 架设完毕,自然要开始做测试了。

这个 project 的接口的命名都挺优雅,直接上代码。

首先是测试基本的功能

var testosterone = require('testosterone')({port: 3000})
  , assert = testosterone.assert;
testosterone
  .get('/hello',function(res){
    assert.equal(res.statusCode, 200);
  })
  .get('/hi',function(res){
    assert.equal(res.statusCode, 500);
  })
  .post('/hi', {data: {message: 'hola'}}, {
    status: 200
    ,body: 'hola'
  });
 

然后针对上面模拟的user的get post 做简单的测试。

var testosterone = require('testosterone')({port: 3000})
  , assert = testosterone.assert;
testosterone  
  .get('/user', function (res) {
    var expectRes = [
        {name:'jack'}, 
        {name:'tom'}
    ];
    assert.equal(res.statusCode, 200);
    assert.equal(JSON.stringify(JSON.parse(res.body)),JSON.stringify(expectRes));
  })
  .get('/user/1', function (res) {
    var user = JSON.parse(res.body);
    assert.equal(res.statusCode, 200);
    assert.equal(user.name, "node js");
    assert.equal(user.description,"I am node js");
  })

接下来,如果你想要针对每个test case 用 give when then 来描述的话,可以这样:

var testosterone = require('testosterone')({port: 3000, title: 'test user api'})
  , add = testosterone.add
  , assert = testosterone.assert;
testosterone
  .add(
    'GIVEN a user id  to /user/{id}  \n' +
    'WHEN it have response user \n' +
    'THEN it should return user json',
    function (cb) {
      testosterone.get('/user/1', cb(function (res) {
        var expectRes = {
            id: 1, 
            name: "node js", 
            description: "I am node js"
        };
        assert.equal(res.statusCode, 200);
        assert.equal(JSON.stringify(JSON.parse(res.body)), JSON.stringify(expectRes));
      }));
  })

  .add(
    'GIVEN a POST  a user info to /user/edit \n' +
    'WHEN find modify success \n' +
    'THEN it should resturn status 1',
    function (cb) {
      testosterone.post('/user/edit', {data: {id: 1, name: "change name"}}, cb(function (res) {
        var res = JSON.parse(res.body);
        assert.equal(res.status, 1);
      }));
    }
  ) 
  .run(function () {
    require('sys').print('done!');
  });

Conclusion
通过以上的代码,可以看出,同java 冗长的 http 头设置等,testosterone确实简单和优雅了不少。

Javascript 相关文章推荐
jQuery的控件及事件(输入控件及回车事件)使用示例
Jul 25 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
Oct 11 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
一分钟理解js闭包
May 04 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
Jul 11 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 Javascript
vue二级路由设置方法
Feb 09 Javascript
vue filters的使用详解
Jun 11 Javascript
请求时token过期自动刷新token操作
Sep 11 Javascript
详细介绍8款超实用JavaScript框架
Oct 25 #Javascript
Javascript基础 函数“重载” 详细介绍
Oct 25 #Javascript
JS关闭窗口或JS关闭页面的几种代码分享
Oct 25 #Javascript
jquery及原生js获取select下拉框选中的值示例
Oct 25 #Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 #Javascript
各种常用的JS函数整理
Oct 25 #Javascript
jquery索引在使用中的一些困惑
Oct 24 #Javascript
You might like
php自动获取目录下的模板的代码
2010/08/08 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
简单的js分页脚本
2009/05/21 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
python爬取m3u8连接的视频
2018/02/28 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
python 爬取小说并下载的示例
2020/12/07 Python
Flask处理Web表单的实现方法
2021/01/31 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
机电一体化大学生求职信
2013/11/08 职场文书
婚前保证书
2014/04/29 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
2015年父亲节寄语
2015/03/23 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js