使用 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 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
JQuery index()方法使用代码
Jun 02 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
Jul 29 Javascript
两个Javascript小tip资料
Nov 23 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
JavaScript的Vue.js库入门学习教程
May 23 Javascript
关于Bootstrap按钮组件消除黄框的方法
May 19 Javascript
js获取地址栏参数的两种方法
Jun 27 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
Oct 31 Javascript
js监听html页面的上下滚动事件方法
Sep 11 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 Javascript
javascript实现一款好看的秒表计时器
Sep 05 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
我的论坛源代码(十)
2006/10/09 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
JS之小练习代码
2008/10/12 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
js加强的经典分页实例
2013/03/15 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
Python使用PIL模块生成随机验证码
2017/11/21 Python
在Python中定义一个常量的方法
2018/11/10 Python
python返回数组的索引实例
2019/11/28 Python
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
计算机专业推荐信范文
2013/11/27 职场文书
户外婚礼策划方案
2014/02/08 职场文书
爱护公物标语
2014/06/24 职场文书
答谢酒会主持词
2015/07/02 职场文书
新闻通讯稿模板
2015/07/22 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python