Koa、Express Web单元测试
标签(空格分隔): koa express test jasmine supertest
通过Koa、express等框架编写的web网站,如何进行单元测试,验证url规则的正确性、router是否能正确处理网络请求等等。简而言之,通过NodeJS搭建了一个web网站,如何验证网站的正确性。
下面我将介绍本文涉及到的两款工具: jasmine和supertest。
jasmine
jasmine是一个款测试工具,类似于mocha,通过它可以定义一些BDD/TDD的单元测试用例。下面我们一个简单的例子来讲述如何使用jasmine。
* Step1, 肯定是安装啦, 通过npm即可安装:
npm install jasmine -g
- Step2, 切换到你的项目目录,使用内置命令,初始化测试用例:
jasmine init
执行完成之后你将得到类似于下面的文件内容:
|–YouProject
|——…. (其他项目文件)
|——spec
|——|—-support
|——|—-|—-jasmine.json (jasmine配置文件)
打开jasmine.json可以看到jasmine的配置,
{
"spec_dir": "spec",
"spec_files": [
"**/*[sS]pec.js"
],
"helpers": [
"helpers/**/*.js"
],
"stopSpecOnExpectationFailure": false,
"random": false
}
由上我们看到, 测试用例的文件只需要按照**/*[sS]pec.js
的命名方式即可,如test/FirstSpec.js。
* Step3, 创建测试用例:
File: spec/test/FirstSpec.js
describe("My First Spec", function(){
// 测试用例
it("Array.prototype.indexOf", function(){
let arr = [1, 3, 5];
expect(arr.indexOf(3)).toBe(1);
expect(arr.indexOf(7)).toBe(-1);
});
});
执行测试用例: jasmine
* Step4,如何处理异步测试
很多情况,需要测试的内容是异步的,这时候只需要做一些小的变动即可支持异步测试,如下例:
// ...
it("Async test case.", function(done){
setTimeout(() =>{
console.info("end.");
done();
}, 1000);
console.info("start.");
});
// ...
跟上例比较,在function中增加了一个done
参数,且异步回调时执行done
函数。
supertest
supertest是一款http的测试工具,可以用它来模拟http请求,并验证http请求的返回值。它最大的亮点是可以跟koa、express等框架无缝衔接。
通过npm install supertest --save-dev
即可安装。下面列举一个简单的koa/express测试样例。
var koa = require("koa");
var express = require("express");
var request = require("supertest");
describe("Http test.", function(){
it("Koa http", function(done){
var app = new koa();
app.use(async function(ctx, next){
ctx.status = 200;
ctx.body = "Hello";
await next();
});
return request(app.listen())
.get("/")
.expect(200)
.expect("Hello")
.end(function(){
done();
});
});
it("Express http", function(done){
var app = new Express();
app.use(function(req, res, next){
res.send(200, "Hello");
next();
});
return request(app)
.get("/")
.expect(200)
.expect("Hello")
.end(function(){
done();
});
});
});
有上述例子可以看出,通过supertest测试http请求只需要按照这么几步即可:
1. 调用request方法,并传入实体(String | express instance | koa instance);
2. 设置输入参数,如.query({name: “value”});
3. 设置expect,如.expect(200).expect(“Hello”);
4. 调用end,并传入回调函数。
经过上述步骤,即可完成一个简单的http请求的测试。
Koa单元测试
开发了一个静态文件的middle ware,通过单元测试验证它的功能。
不多说,直接上例子:
var koa = require("koa");
var koa2FileMiddle = require("koa2-file-middle");
var request = require("supertest");
describe("Make a https test.", function(){
let requestAPI = null;
beforeAll(function(){
var k = new koa();
k.use(koa2FileMiddle(["./spec", "./"], {
cached: true,
lastModified:true,
etag: true,
debug: false
}));
requestAPI = request(k.listen());
});
it("Test a file.", function(done){
return requestAPI.get("/tsconfig.json")
.set("Accept", "application/json")
.expect(200)
.end((err, response) => {
if(err){
throw err;
}
console.dir(response.header);
done();
});
});
it("Test last modified", function(done){
return requestAPI.get("/tsconfig.json")
.set("Accept", "application/json")
.set("If-Modified-Since", "Tue, 12 Sep 2017 10:10:21 GMT")
.expect(304)
.end((err, response) => {
if(err){
throw err;
}
console.dir(response.header);
console.info(response.status);
done();
});
});
it("Test etag", function(done){
return requestAPI.get("/tsconfig.json")
.set("Accept", "application/json")
.set("If-None-Match", 'W/"23b-15e759179e8"')
.expect(304)
.end((err, response) => {
if(err){
throw err;
}
console.dir(response.header);
console.info(response.status);
done();
});
});
});
基本思路为,本地开启一个http server,然后通过supertest构造一些网络请求,发送到http server,再利用supertest提供的方法,完成对结果的验证。