使用 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 不能释放内存.
Sep 07 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
Mar 06 Javascript
jquery获取选中的文本和值的方法
Jul 08 Javascript
推荐10 款 SVG 动画的 JavaScript 库
Mar 24 Javascript
如何防止JavaScript自动插入分号
Nov 05 Javascript
Jquery easyui开启行编辑模式增删改操作
Jan 14 Javascript
JS取模、取商及取整运算方法示例
Oct 13 Javascript
JS实现的简易拖放效果示例
Dec 29 Javascript
深入理解vue2.0路由如何配置问题
Jul 18 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
Jan 02 Javascript
返回上一个url并刷新界面的js代码
Sep 12 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动态生成JavaScript代码
2009/03/09 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
常用PHP封装分页工具类
2017/01/14 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
PHP学习笔记之session
2018/05/06 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
iframe 异步加载技术及性能分析
2011/07/19 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
python中requests和https使用简单示例
2018/01/18 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
使用Django清空数据库并重新生成
2020/04/03 Python
Python如何将函数值赋给变量
2020/04/28 Python
基于python实现计算两组数据P值
2020/07/10 Python
详解Python中的文件操作
2021/01/14 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
学校2014重阳节活动策划方案
2014/09/16 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
mysql事务对效率的影响分析总结
2021/10/24 MySQL
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript