使用 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 相关文章推荐
在javascript中关于节点内容加强
Apr 11 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
Dec 26 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
Feb 25 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
js操作XML文件的实现方法兼容IE与FireFox
Jun 25 Javascript
分类解析jQuery选择器
Nov 23 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
vue.js与后台数据交互的实例讲解
Aug 08 Javascript
JavaScript中this关键字用法实例分析
Aug 24 Javascript
es6函数之尾递归用法实例分析
Apr 25 Javascript
原生JS实现拖拽功能
Dec 16 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
php读取xml实例代码
2010/01/28 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
PHP二维数组的去重问题解析
2011/07/17 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
jQuery 中DOM 操作详解
2015/01/13 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
Python中的两个内置模块介绍
2015/04/05 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
python中adb有什么功能
2020/06/07 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
大跃进口号
2014/06/16 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
公司会议开幕词
2016/03/03 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS