使用 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技巧来提高你的代码
Jan 08 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
JavaScript实现MIPS乘法模拟的方法
Apr 17 Javascript
bootstrap-treeview自定义双击事件实现方法
Jan 09 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
URL中“#” “?” &“”号的作用浅析
Feb 04 Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 jQuery
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 Javascript
JS实现小星星特效
Dec 24 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转成EXE文件
2006/10/09 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
下载给定网页上图片的方法
2014/02/18 Python
python中引用与复制用法实例分析
2015/06/04 Python
Python实现截屏的函数
2015/07/26 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python