使用 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 相关文章推荐
彪哥1.1(智能表格)提供下载
Sep 07 Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
Jan 12 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
Aug 02 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
小程序云开发获取不到数据库记录的解决方法
May 18 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 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可逆加密函数(分享)
2013/06/06 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
浅谈python中requests模块导入的问题
2018/05/18 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
python实现的自动发送消息功能详解
2019/08/15 Python
python 实现list或string按指定分段
2019/12/25 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
Python异常处理机制结构实例解析
2020/07/23 Python
python/golang 删除链表中的元素
2020/09/14 Python
HTML5未来发展趋势
2016/02/01 HTML / CSS
Footshop法国:购买运动鞋
2020/01/19 全球购物
怎样有效的进行自我评价
2013/10/06 职场文书
师范大学应届生求职信
2013/11/21 职场文书
大学三年计划书范文
2014/04/30 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers