[关闭]
@zhongjianxin 2017-07-25T11:21:06.000000Z 字数 3089 阅读 1492

TDD

Trainning


1.TDD

TDD简介 - What?

传统编码方式

遗留代码就是没有测试的代码

image.png-233kB


有没有一种好的开发方式来帮助我们更好的开发?


TDD出来的代码,对于Value来说刚刚好,既能满足需要,又能保证设计的干净、可扩展性(重用)和搞维护性

    Test First Programming(起源于XP)
    1999年提出了TDD
    测试驱动开发:(Test-driven development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名。
测试驱动开发是戴两顶帽子思考的开发方式:先戴上实现功能的帽子,在测试的辅助下,快速实现其功能;再戴上重构的帽子,在测试的保护下,通过去除冗余的代码,提高代码质量。测试驱动着整个开发过程:首先,驱动代码的设计和功能的实现;其后,驱动代码的再设计和重构。
    Test Driver Development(Business、Design)

好处 - Why?

TDD 套路 - How?

定义image.png-227.3kB

过程-Cycleimage.png-297.5kB

三大定律

实践

  • 描述:产品代码的外部行为
  • 新功能:现有代码已有测试保证
  • 失败的:不满足于现状的诉求
  • 刚好:述求简练而有针对性
  • 一次只写一个:小步前进

用例分析

Wirte Test first process - Red(需求澄清)

Given

When

Then

Test dirven implementation - (实现与设计)

测试通过:唯一目的

原则

仅当Test Case达到2个或更多,并且第2个Case需要更一般化的解决方案时,才对代码实施一般化(泛化/抽象/模式)。

设计

Refactor to Clean Code - Yellow - (设计与价值存留)

重构

在保证既有功能的外部行为不变的前提下,对其代码设计做出优化,去除坏味道
image.png-228kB

旧的不变,新的创建,一步切换,旧的再见

为什么要重构
什么时候重构
代码坏味道
重构手法
TDD里面的重构
借助重构工具

测试基本原则

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!)

命名规则

  1. @Test
  2. public void should_not_charge_addition_fare_when_given_distance_is_less_than_base_meter() throws Exception {
  3. assertThat(new AdditionTaxiCharge(3, 1.6).charge(new RideInfo(3, 12)), is(BigDecimal.valueOf(0.0)));
  4. }
  5. @Test
  6. public void should_charge_addition_fare_when_given_distance_is_more_than_base_meter() throws Exception {
  7. assertThat(new AdditionTaxiCharge(3, 1.6).charge(new RideInfo(4, 12)), is(BigDecimal.valueOf(1.6)));
  8. }

Tasking for design and Task list for TDD test case

从依赖的角度看,并不一定需要优先选择前序任务,因为我们可以使用 Mock 的方式驱动出当前任务需要依赖的接口,而不用考虑实现。
对于任务的重要性,主要是判断任务是否整个系统(模块)的核心功能。一个 判断标准是确定任务是功能的主要流程还是异常流程。

- 驱动承担该职责的对象,根据意图设计接口

TDD 三大定律

Mock in TDD - [in Given Stage]

什么时候使用Mock

测试景深与步子的大小:
1.image.png-235.5kB
2.image.png-94.6kB

TDD 总结

比如你敲钉子,如果一口气敲完了才发现,敲歪了,那就得拔出来重新来,可是东西上已经有一个很深的洞了。所以,好的方式是敲一敲,检查一下,随时纠正方向,确保前进的大方向是正确的。


TDD重要的不是测试代码本身,是解决问题的思维


小步快跑,快速反馈,实现刚好,设计优美,价值优先,增量完美

image.png-1115.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注