使用 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 相关文章推荐
JS 判断undefined的实现代码
Nov 26 Javascript
JS 图片缩放效果代码
Jun 09 Javascript
使用jquery为table动态添加行的实现代码
Mar 30 Javascript
jsPDF导出pdf示例
May 02 Javascript
js中使用replace方法完成某个字符的转换
Aug 20 Javascript
28个常用JavaScript方法集锦
Jan 14 Javascript
jQuery实现简单隔行变色的方法
Feb 20 Javascript
利用JS实现简单的日期选择插件
Jan 23 Javascript
vue-router跳转页面的方法
Feb 09 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
利用Angular2的Observables实现交互控制的方法
Dec 27 Javascript
vue 实现微信浮标效果
Sep 01 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
终于听上了直流胆调频
2021/03/02 无线电
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
vue 组件简介
2020/07/31 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
python threading模块操作多线程介绍
2015/04/08 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
Linux常见面试题
2013/03/18 面试题
职业生涯规划书的格式
2013/12/29 职场文书
黄金搭档广告词
2014/03/21 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
公司聚餐通知
2015/04/22 职场文书