TDD
Tasking Review
- Story 的评价标准?
- Task 的评价标准?
Tasking Homework
- 实现一个人与人对弈的象棋软件
- 描述一个你做过的特性,如果用walking skeleton方式如何做拆分
测试,测的是什么?
传统方法

传统方法 + 自动化测试

Test Driven Development

WHAT
WHY

HOW
-
将需求分解为互不交集的子问题
-
将子问题拆解成多个可测试实例
-
递进地解决子问题
Example
设计一个长度类库
使它可以计算这样的计算公式
1m / 4 + 10cm * 3 – 5mm
= 545mm
= 54.5cm
= 0.545m
1. 将需求分解为互不交集的子问题

2. 将子问题拆解成多个可测试实例
- Equation with same unit
- 1 metre equals 1 metre
- Equation with different unit
- Addition
- With Same Unit
- With Different Unit
- Subtraction
- Multiplication/Division
3. 递进地解决子问题

3. 递进地解决子问题时的原则
测试:一次只写一个刚好失败的测试,作为新加功能的描述;
实现:不写任何产品代码,除非它刚好能让失败着的测试通过;
重构:只在测试全部通过的前提下,开始新加功能,或重构代码。
test 1
ASSERT_EQ(Length(10.5, "m"), Length(10.5, "m"));
test 2
ASSERT_EQ(Length(10.5, "m"), Length(1050, "cm"));
enum {M = 1000, CM = 10, MM = 1};
ASSERT_EQ(Length(10.5, M), Length(1050, CM));
test 3
Length(10.5, "m") + Length(10.5, "m")
Length(10.5, "m") - Length(5, "m")
Length(10.5, "m") * 5
Length(10.5, "m") / 5
TDD的依赖
- Tasking
- Test
- Implement
- Refactor
Bad Smell
- 重复代码
- 方法过长
- 类太大
- 参数列表太长
- 特性依赖
- Magic number
……
Exercise
出租车计价问题:
出租车的运价是每公里0.8元,八公里起会加收50%的每公里运价,起步价是两公里以内6块,停车等待时加收每分钟0.25元,最后计价的时候司机会四舍五入只收块块钱。
1. 将需求分解为互不交集的子问题
- 路程, Distance
- 计价器, Taximeter
- 收费, Charge
- 起价, Flag Price
- 四舍五入, Round
- 每公里价, Price Per Kilometer
- 停车等待, Stop Waiting
- 加收费用, Extra Charge
2. 将子问题拆解成多个可测试实例
- 作为司机, 我可以通过计价器计算车费, 每公里0.8元
- 作为司机, 我可以通过计价器在八公里后每公里加收50%运价
- 作为司机, 我可以通过计价器在两公里内收取6元定额费用
- 作为司机, 我可以通过计价器在等待时收取每分钟0.25元费用
- 作为司机, 我可以通过计价器在收费时去掉零头, 四舍五入至元
3. 递进地解决子问题

3. 递进地解决子问题时的原则
测试:一次只写一个刚好失败的测试,作为新加功能的描述;
实现:不写任何产品代码,除非它刚好能让失败着的测试通过;
重构:只在测试全部通过的前提下,开始新加功能,或重构代码。
Q & A
TDD
By melonq
TDD
- 487