使用 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 相关文章推荐
使用Node.js为其他程序编写扩展的基本方法
Jun 23 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
动态更新highcharts数据的实现方法
May 28 Javascript
JavaScript中Number对象的toFixed() 方法详解
Sep 02 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
Oct 17 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
Dec 18 Javascript
vue实现百度搜索下拉提示功能实例
Jun 14 Javascript
Vue实现typeahead组件功能(非常靠谱)
Aug 26 Javascript
js实现搜索栏效果
Nov 16 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
分享一个vue项目“脚手架”项目的实现步骤
May 26 Javascript
ES6顶层对象、global对象实例分析
Jun 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根据日期判断星座的函数分享
2014/02/13 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
js实现的网页颜色代码表全集
2007/07/17 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
JavaScript实现英语单词题库
2019/12/24 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
python求斐波那契数列示例分享
2014/02/14 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python中kmeans聚类实现代码
2018/02/23 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
pycharm永久激活超详细教程
2020/10/29 Python
Python request post上传文件常见要点
2020/11/20 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
人力资源经理自我评价
2014/01/04 职场文书
初三化学教学反思
2014/01/23 职场文书
党委班子剖析材料
2014/08/21 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
模范教师事迹材料
2014/12/16 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
详解MindSpore自定义模型损失函数
2021/06/30 Python
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB