Welcome 微信登录

首页 / 脚本样式 / JavaScript / 使用 Node.js 做 Function Test实现方法

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}  " +
    "WHEN it have response user " +
    "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 " +
    "WHEN find modify success " +
    "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确实简单和优雅了不少。