Info
At last week’s meeting, colleagues said that they are now using java to write function tests, which has produced a lot of redundant code and the entire project has become bloated. Now we urgently need a simple template project to quickly build a function test.
Later I went back and thought about it, why do we have to use java to do function test?
Node.js should be a good choice, and it has natural support for json, so I went back and searched on github, and there was indeed a related project: testosterone, so I came up with this blog.
Server
If you want to demo, you must have a corresponding server to support it.
Here we choose Express as the server.
First we create a server folder and create a new package.json.
Next run command
Express is now installed.
We implement several simple get post methods for experiment
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
After setting up the server, it’s natural to start testing.
The interfaces of this project are very elegantly named and can be directly loaded into the code.
First, test the basic functions
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'
});
Then do a simple test on the get post of the user simulated above.
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");
})
Next, if you want to use give when then to describe each test case, you can do this:
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
Through the above code, it can be seen that testosterone is indeed much simpler and more elegant than Java's lengthy http header settings.