使用 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 相关文章推荐
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
js 面向对象的技术创建高级 Web 应用程序
Feb 25 Javascript
关闭时刷新父窗口两种方法
May 07 Javascript
七个很有意思的PHP函数
May 12 Javascript
JS获得浏览器版本和操作系统版本的例子
May 13 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
jQuery CSS()方法改变现有的CSS样式表
Sep 09 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
根据配置文件加载js依赖模块
Dec 29 Javascript
浅析vue.js数组的变异方法
Jun 30 Javascript
vue.js中toast用法及使用toast弹框的实例代码
Aug 27 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 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脚本数据库功能详解(中)
2006/10/09 PHP
扩展你的 PHP 之入门篇
2006/12/04 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php生成html文件方法总结
2014/12/01 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
斜45度寻路实现函数
2009/08/20 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
javascript 动态创建表格
2015/01/08 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
在Python中使用模块的教程
2015/04/27 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
django框架auth模块用法实例详解
2019/12/10 Python
Python编写单元测试代码实例
2020/09/10 Python
python 下载文件的几种方法汇总
2021/01/06 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
保护环境倡议书300字
2014/05/19 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
青春雷锋观后感
2015/06/10 职场文书
远程教育学习心得体会
2016/01/23 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis