强烈建议基于测试驱动
开发。测试驱动
开发,可以有效沉淀开发成果,当代码出现变更时也能尽快锁定潜在问题,从而显著提升代码的鲁棒性
EggBornJS在EggJS
的基础上,提供了一个便捷的框架,可以很方便的实现基于测试驱动
的开发
模块test-party
模块test-party
是开箱即用的测试模块,提供大量的测试驱动
开发指引。包含CabloyJS所有内置核心模块的测试用例
,不仅可以验证CabloyJS架构本身的鲁棒性,也可以作为实际业务开发的代码范本
在本教程中,示范了以下几个环节的测试。您可以此为范例,不断扩充测试用例
,尽可能多的提高代码覆盖率
- 用户登录
- 新建party
- 提交party(从
草稿状态
提交到正常状态
) - 查询party
- 删除party
测试代码
src/suite-vendor/test-party/modules/test-party/backend/test/controller/test.test.js
- 1const { app, mockUrl, mockInfo, assert } = require('egg-born-mock')(__dirname);
- 2
- 3describe('action: atom: party', () => {
- 4 it('[atom]', async () => {
- 5 app.mockSession({});
- 6
- 7 // atomClass info
- 8 const atomClassModule = mockInfo().relativeName;
- 9 const atomClassName = 'party';
- 10
- 11 // login as root
- 12 await app.httpRequest().post(mockUrl('/a/authsimple/passport/a-authsimple/authsimple')).send({
- 13 data: {
- 14 auth: 'root',
- 15 password: '123456',
- 16 },
- 17 });
- 18
- 19 // create
- 20 let result = await app.httpRequest().post(mockUrl('/a/base/atom/create')).send({
- 21 atomClass: { module: atomClassModule, atomClassName },
- 22 });
- 23 assert(result.body.code === 0);
- 24 const keyDraft = result.body.data;
- 25
- 26 // submit
- 27 result = await app.httpRequest().post(mockUrl('/a/base/atom/writeSubmit')).send({
- 28 key: keyDraft,
- 29 item: {
- 30 atomName: 'party demo',
- 31 personCount: 3,
- 32 },
- 33 });
- 34 assert(result.body.code === 0);
- 35 const keyFormal = result.body.data.formal.key;
- 36
- 37 // read
- 38 result = await app.httpRequest().post(mockUrl('/a/base/atom/read')).send({
- 39 key: keyFormal,
- 40 });
- 41 assert(result.body.code === 0);
- 42
- 43 // delete
- 44 result = await app.httpRequest().post(mockUrl('/a/base/atom/delete')).send({
- 45 key: keyFormal,
- 46 });
- 47 assert(result.body.code === 0);
- 48
- 49 });
- 50});
名称 | 说明 |
---|---|
mockUrl | 用于构造完整的后端API接口地址 |
mockInfo | 用于获取当前测试所属模块的基本信息。比如当前模块名是test-party ,但为了提升代码的灵活性,可以通过mockInfo().relativeName 获取 |
app.mockSession | 用于模拟Session环境 |
执行测试
- 1$ npm run test:backend
测试覆盖率统计
- 1$ npm run cov:backend
Bean组件:version.mamager
在测试用例
执行之前,每个模块的Bean组件version.mamager
的test
方法都会自动执行
可以在这个阶段准备一些测试数据(如测试用的角色
、用户
、权限
等等)
以模块test-party
为例:
src/suite-vendor/test-party/modules/test-party/backend/src/bean/version.manager.js
- 1const VersionTestFn = require('./version/test.js');
- 2
- 3async test() {
- 4 const versionTest = new (VersionTestFn(this.ctx))();
- 5 await versionTest.run();
- 6}
app.meta.isTest, app.meta.isLocal
可以通过app.meta.isTest
、app.meta.isLocal
在合适的环境加载合适的代码逻辑
比如,模块test-party
里面的资源,只允许在测试环境
和开发环境
中生效,在生产环境
无效,可以操作如下:
src/suite-vendor/test-party/modules/test-party/backend/src/models.js
- 1const party = require('./model/party.js');
- 2const partyType = require('./model/partyType.js');
- 3
- 4module.exports = app => {
- 5 const models = {
- 6 };
- 7 if (app.meta.isTest || app.meta.isLocal) {
- 8 Object.assign(models, {
- 9 party,
- 10 partyType,
- 11 });
- 12 }
- 13 return models;
- 14};
评论: