使用 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小技巧 2.5 则
Sep 12 Javascript
Javascript Throttle & Debounce应用介绍
Mar 19 Javascript
Jquery实现三层遍历删除功能代码
Apr 23 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
如何获取网站icon有哪些可行的方法
Jun 05 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
jquery动态添加删除(tr/td)
Feb 09 Javascript
JS实现获取剪贴板内容的方法
Jun 21 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
Sep 01 Javascript
微信小程序的线程架构【推荐】
May 14 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中使用PDF文档功能
2006/10/09 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
Java基础知识面试题
2014/03/25 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
大班亲子运动会方案
2014/06/10 职场文书
服务标语大全
2014/06/18 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
如何书写邀请函?
2019/06/24 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python