@zhongjianxin
2017-07-25T11:21:06.000000Z
字数 3089
阅读 1492
Trainning
遗留代码就是没有测试的代码
有没有一种好的开发方式来帮助我们更好的开发?
TDD出来的代码,对于Value来说刚刚好,既能满足需要,又能保证设计的干净、可扩展性(重用)和搞维护性
Test First Programming(起源于XP)
1999年提出了TDD
测试驱动开发:(Test-driven development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名。
测试驱动开发是戴两顶帽子思考的开发方式:先戴上实现功能的帽子,在测试的辅助下,快速实现其功能;再戴上重构的帽子,在测试的保护下,通过去除冗余的代码,提高代码质量。测试驱动着整个开发过程:首先,驱动代码的设计和功能的实现;其后,驱动代码的再设计和重构。
Test Driver Development(Business、Design)
- 描述:产品代码的外部行为
- 新功能:现有代码已有测试保证
- 失败的:不满足于现状的诉求
- 刚好:述求简练而有针对性
- 一次只写一个:小步前进
仅当Test Case达到2个或更多,并且第2个Case需要更一般化的解决方案时,才对代码实施一般化(泛化/抽象/模式)。
在保证既有功能的外部行为不变的前提下,对其代码设计做出优化,去除坏味道
旧的不变,新的创建,一步切换,旧的再见
FIRST Principle
- 1.Fast: run (subset of) tests quickly (since you'll be running them all the time)
- 2.Independent: no tests depend on others, so can run any subset in any order
- 3.Repeatable: run N times, get same result (to help isolate bugs and enable automation)
- 4.Self-checking: test can automatically detect if passed (no human checking of output)
- 5.Timely: written about the same time as code under test (with TDD, written first!)
@Test
public void should_not_charge_addition_fare_when_given_distance_is_less_than_base_meter() throws Exception {
assertThat(new AdditionTaxiCharge(3, 1.6).charge(new RideInfo(3, 12)), is(BigDecimal.valueOf(0.0)));
}
@Test
public void should_charge_addition_fare_when_given_distance_is_more_than_base_meter() throws Exception {
assertThat(new AdditionTaxiCharge(3, 1.6).charge(new RideInfo(4, 12)), is(BigDecimal.valueOf(1.6)));
}
从依赖的角度看,并不一定需要优先选择前序任务,因为我们可以使用 Mock 的方式驱动出当前任务需要依赖的接口,而不用考虑实现。
对于任务的重要性,主要是判断任务是否整个系统(模块)的核心功能。一个 判断标准是确定任务是功能的主要流程还是异常流程。
TDD 三大定律
测试景深与步子的大小:
1.
2.
比如你敲钉子,如果一口气敲完了才发现,敲歪了,那就得拔出来重新来,可是东西上已经有一个很深的洞了。所以,好的方式是敲一敲,检查一下,随时纠正方向,确保前进的大方向是正确的。
TDD重要的不是测试代码本身,是解决问题的思维
小步快跑,快速反馈,实现刚好,设计优美,价值优先,增量完美