一个简单的想法就是在测试前启动koa的app,然后运行async测试,在测试代码中发送http请求,收到响应后检查结果,这样,一个基于http接口的测试就可以自动运行。

    我们先创建一个最简单的koa应用,结构如下:

    这个koa应用和前面的koa应用稍有不同的是,只负责创建app实例,并不监听端口:

    1. // app.js
    2. const Koa = require('koa');
    3. const app = new Koa();
    4. app.use(async (ctx, next) => {
    5. const start = new Date().getTime();
    6. const ms = new Date().getTime() - start;
    7. console.log(`${ctx.request.method} ${ctx.request.url}: ${ms}ms`);
    8. ctx.response.set('X-Response-Time', `${ms}ms`);
    9. });
    10. app.use(async (ctx, next) => {
    11. ctx.response.type = 'text/html';
    12. ctx.response.body = `<h1>Hello, ${name}!</h1>`;
    13. });
    14. module.exports = app;

    start.js负责真正启动应用:

    这样做的目的是便于后面的测试。

    在测试前,我们在package.json中添加devDependencies,除了mocha外,我们还需要一个简单而强大的测试模块supertest

    1. {
    2. ...
    3. "devDependencies": {
    4. "mocha": "3.0.2",
    5. "supertest": "3.0.0"
    6. }

    运行npm install后,我们开始编写测试:

    在测试中,我们首先导入supertest模块,然后导入app模块,注意我们已经在app.js中移除了app.listen(3000);语句,所以,这里我们用:

    1. let server = app.listen(9900);

    app实例监听在9900端口上,并且获得返回的server实例。

    在测试代码中,我们使用:

    可以手动检查响应对象,例如,res.body,还可以利用supertest提供的expect()更方便地断言响应的HTTP代码、返回内容和HTTP头。断言HTTP头时可用使用正则表达式。例如,下面的断言:

    1. .expect('Content-Type', /text\/html/)

    可用成功匹配到Content-Typetext/html、等值。

    当所有测试运行结束后,app实例会自动关闭,无需清理。

    利用mocha的异步测试,配合supertest,我们可以用简单的代码编写端到端的HTTP自动化测试。

    读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论: