测试
应用开发中,测试十分重要,在传统 Web 产品快速迭代的时期,每个测试用例都给应用的稳定性提供了一层保障。 API 升级,测试用例可以很好地检查代码是否向下兼容。 对于各种可能的输入,一旦测试覆盖,都能明确它的输出。 代码改动后,可以通过测试结果判断代码的改动是否影响已确定的结果。
所以,应用的 Controller、Service 等代码,都必须有对应的单元测试保证代码质量。 当然,框架和组件的每个功能改动和重构都需要有相应的单元测试,并且要求尽量做到修改的代码能被 100% 覆盖到。
当前社区的测试库主要是 jest
和 mocha
,本文以 jest
作为示例 。
测试目录结构
我们约定 test
目录为存放所有测试脚本的目录,测试所使用到的 fixtures
和相关辅助脚本都应该放在此目录下。
测试脚本文件统一按 ${filename}.test.ts
命名,必须以 .test.ts
作为文件后缀。
一个应用的测试目录示例:
➜ my_midway_app tree
.
├── src
├── test
│ └── controller
│ └── home.controller.test.ts
├── package.json
└── tsconfig.json
测试运行工具
Midway 默认提供 midway-bin
命令来运行测试脚本。在新版本中,Midway 默认将 mocha 替换成了 Jest,它的功能更为强大,集成度更高,这让我们聚焦精力在编写测试代码上,而不是纠结选择那些测试周边工具和模块。
只需要在 package.json
上配置好 scripts.test
即可。
- 直接使用 jest
- 使用 @midwayjs/cli
{
"scripts": {
"test": "jest"
}
}
然后就可以按标准的 npm test
来运行测试了,默认脚手架中,我们都已经提供了此命令,所以你可以开箱即用的运行测试。
➜ my_midway_app npm run test
> my_midway_project@1.0.0 test /Users/harry/project/application/my_midway_app
> jest
Testing all *.test.ts...
PASS test/controller/home.controller.test.ts
PASS test/controller/api.controller.test.ts
Test Suites: 2 passed, 2 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 3.26 s
Ran all test suites matching /\/test\/[^.]*\.test\.ts$/i.
{
"scripts": {
"test": "midway-bin test --ts"
}
}
然后就可以按标准的 npm test
来运行测试了,默认脚手架中,我们都已经提供了此命令,所以你可以开箱即用的运行测试。
➜ my_midway_app npm run test
> my_midway_project@1.0.0 test /Users/harry/project/application/my_midway_app
> midway-bin test
Testing all *.test.ts...
PASS test/controller/home.controller.test.ts
PASS test/controller/api.controller.test.ts
Test Suites: 2 passed, 2 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 3.26 s
Ran all test suites matching /\/test\/[^.]*\.test\.ts$/i.
断言库
jest 中自带了强大的 expect
断言库,可以直接在全局使用它。
比如常用的。
expect(result.status).toBe(200); // 值是否等于某个值,引用相等
expect(result.status).not.toBe(200);
expect(result).toEqual('hello'); // 简单匹配,对象属性相同也为 true
expect(result).toStrictEqual('hello'); // 严格匹配
expect(['lime', 'apple']).toContain('lime'); // 判断是否在数组中
更多断言方法,请参考文档 https://jestjs.io/docs/en/expect