测试驱动

2018-11-21 15:13:05

强烈建议基于测试驱动开发。测试驱动开发,可以有效沉淀开发成果,当代码出现变更时也能尽快锁定潜在问题,从而显著提升代码的鲁棒性

Cabloy在EggJS的基础上,提供了一个便捷的框架,可以很方便的实现基于测试驱动的开发

在本教程中,示范了以下几个环节的测试。您可以此为范例,不断扩充测试用例,尽可能多的提高代码覆盖率

  1. 用户登录
  2. 新建todo
  3. 提交todo(从草稿状态提交到正常状态
  4. 查询todo
  5. 删除todo

测试代码

src/module/test-todo/backend/test/controller/test.test.js

const { app, mockUrl, mockInfo, assert } = require('egg-born-mock')(__dirname);

describe('[your tests start from here]', () => {
  it('[atom]', async () => {
    app.mockSession({});

    // atomClass info
    const atomClassModule = mockInfo().relativeName;
    const atomClassName = 'todo';

    // login as root
    await app.httpRequest().post(mockUrl('/a/authsimple/passport/a-authsimple/authsimple')).send({
      auth: 'root',
      password: '123456',
    });

    // create
    let result = await app.httpRequest().post(mockUrl('/a/base/atom/create')).send({
      atomClass: { module: atomClassModule, atomClassName, atomClassIdParent: 0 },
    });
    assert(result.body.code === 0);
    const atomKey = result.body.data;

    // submit
    result = await app.httpRequest().post(mockUrl('/a/base/atom/submit')).send({
      key: atomKey,
      item: {
        atomName: 'test',
        description: 'this is a test',
      },
    });
    assert(result.body.code === 0);

    // read
    result = await app.httpRequest().post(mockUrl('/a/base/atom/read')).send({
      key: atomKey,
    });
    assert(result.body.code === 0);

    // delete
    result = await app.httpRequest().post(mockUrl('/a/base/atom/delete')).send({
      key: atomKey,
    });
    assert(result.body.code === 0);

  });
});
名称 说明
mockUrl 用于构造完整的后端API接口地址
mockInfo 用于获取当前测试所属模块的基本信息。比如当前模块名是test-todo,但为了提升代码的灵活性,可以通过mockInfo().relativeName获取
app.mockSession 用于模拟Session环境

执行测试

$ npm run test:backend

测试覆盖率统计

$ npm run cov:backend


评论: