使用mocha与chai对TypeScript进行测试——02
1. 准备测试用例
测试用例来源于需求,我们依据需求分析写出测试用例,而需求实例化非常适合用于TDD开发,一般情况下,可以将需求实例化后的结果直接拿来当作关键测试用例。
以下是实例化后的用例:
用例 性别 年龄 体重 基础热量 体重修正系数 推荐热量
1 男 12 30 380 14.1 803
2 男 18 60 680 15.2 1592
3 女 18 60 450 14.6 1326
4 男 30 79 680 15.2 1880.8
5 女 31 79 830 8.6 1509.4
6 女 59 79 830 8.6 1509.4
7 男 60 60 830 11.5 1520
8 男 90 50 490 13.4 1160
2. 测试驱动开发(TDD)步骤
TDD简单来说只有三步曲:
- 编写测试用例代码
- 快速让测试通过
- 重构
但这三步就完成了一个从需求到实现再到架构设计的闭环,编写测试用例代码就是将需求中每一个验收条件以测试用例的形式体现在代码中,而快速让测试通过就是针对测试代码编写功能实现代码,紧扣主题,重构是及时消除代码中的坏味道,优化代码结构,让代码与设计紧贴当前功能。
TDD就是不断重复这3个步骤,将需求一点点实现,因为所有的功能代码以及设计都是依据需求驱动出来的,所以代码与设计都是最贴合当前需求的实现。
3. 第1个测试
describe('#热量计算测试', () => {
describe('每日消耗热量估算', () => {
it('#1 12岁 30公斤的男性推荐每天消耗 803卡热量', () => {
const expected = 803;
const actual = target.calculate(Sex.male, 12, 30);
expect(actual).to.equal(expected);
});
})
})
基于测试代码,可以写出如下功能代码:
class CaloryCalculator {
calculate(sex: Sex, age: number, weight: number): number {
return 803;
}
}
运行结果如下:
$ npm run test
> TypescriptTesting@1.0.0 test /Users/jason/dev/research/TypescriptTesting
> mocha -r ./node_modules/ts-node/register spec/**/*.ts
#热量计算测试
每日消耗热量估算
✓ #1 12岁 30公斤的男性推荐每天消耗 803卡热量
1 passing (9ms)
为什么返回一个hardcode 803呢?就是快速让测试通过,然后进行重构环节,我们在这里粗略可以找出几个坏味道:
- 硬编码
- 未使用的参数
围绕坏味道进行代码重构,重构后的代码如下:
class CaloryCalculator {
calculate(sex: Sex, age: number, weight: number): number {
if (sex == Sex.male) {
if (age < 18) {
return 380 + 14.1 * weight;
}
}
return 0;
}
}
强调一点,这里重构后的代码并未完全消除坏味道,甚至引入了新的问题,魔法数,我们会在下一次分享中专门谈一谈如何进行代码重构。
另外,因为我们的功能代码都有测试代码所覆盖,所以可以比较放心大胆地进行重构操作。重构的技能是另外一个主题,需要至少两堂培训课才能达到初见成效。
4. 完善功能
使用TDD三步曲,补充功能进行实现,完成后的参考代码如下:
https://gitee.com/JasonLiSz/TypescriptTesting/tree/feature/TDD_CaloryCalculator