使用 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跨域刷新实现代码
Jan 01 Javascript
jQuery中 noConflict() 方法使用
Apr 25 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
Aug 11 Javascript
js制作支付倒计时页面
Oct 21 Javascript
微信小程序实现图片预加载组件
Jan 18 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
Aug 04 Javascript
Windows安装Node.js报错:2503、2502的解决方法
Oct 25 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 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
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
Python分支结构(switch)操作简介
2018/01/17 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
详解如何修改python中字典的键和值
2020/09/29 Python
美国家具网站:Cymax
2016/09/17 全球购物
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
《春雨》教学反思
2014/04/24 职场文书
初中作文评语
2014/12/25 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
决心书格式及范文
2019/06/24 职场文书
mysql知识点整理
2021/04/05 MySQL
python基础之while循环语句的使用
2021/04/20 Python