测试驱动开发
测试驱动开发(TDD)
测试优先的一种开发模式。
graph TD
开始开发测试((开始开发测试)) ==> 添加开发测试
添加开发测试(开始开发测试) ==> 运行开发测试{运行开发测试}
运行开发测试(运行开发测试) --> |不通过| 修改开发代码(修改开发代码)
修改开发代码 --> 运行开发测试
运行开发测试 ==> |通过| 完成开发测试(完成开发测试)
验收测试驱动开发 & 测试驱动开发
验收测试驱动开发(ATDD)
验收测试,其目的是在JIT的基础上为解决方案指定详细的、可执行的需求。也称之为BDD(行为驱动开发)
测试驱动开发(TDD)
TDD简单的归纳为:单元测试。这就对代码设计会有要求,比如说,必须是高内聚、低耦合的组件组成(这样也会使系统迭代和维护更加容易)。
ATDD和TDD如何协作
flowchart TB
subgraph 验收测试
编写验收测试(编写验收测试) ==> 运行验收测试(运行验收测试)
运行验收测试 --> |不通过| 验收测试是否正确{验收测试是否正确}
验收测试是否正确 --> |不正确| 修改验收测试(修改验收测试)
修改验收测试 --> 运行验收测试
end
subgraph 开发测试
开始开发测试((开始开发测试)) ==> 添加开发测试(添加开发测试)
添加开发测试 ==> 运行开发测试{运行开发测试}
运行开发测试 --> |不通过| 修改开发代码(修改开发代码)
修改开发代码 --> 运行开发测试
运行开发测试 ==> |通过| 完成开发测试((完成开发测试))
end
验收测试是否正确 --> |正确| 开始开发测试
完成开发测试 ==> |通过| 运行验收测试
运行验收测试 ==> |通过| 验收完成((验收完成))
开始验收((开始验收)) ==> 编写验收测试
为什么需要TDD
场景1:修改了一个通用函数,修复了A处的问题,却让B出现问题
就是说,修改了一个稍微底层一些的函数,造成了其他地方代码出现异常的问题。如果缺少测试,无法覆盖所有的代码,他就会超出你的预期。修复一个BUG,然后又创造了一个新的BUG。
场景2:系统运行的时候,出现不可预知的问题
也就是说,代码健壮性不够。缺少测试,会让我们对程序的信心不足。这时候,我们需要编写单元测试,让某个函数,在输入正常、异常和临界值的时候都能输出我们预期的预期值。当所有的测试都是Pass
的时候,我们对这个模块,最少在预期内,是安全放心的。如果系统遇到未预期的输入,产生异常,这时候我们可以把这个异常输入又变成一个测试。修改源代码,让全部测试通过,这样这个模块又更健壮了。
测试驱动开发原则
- 只有当有失败的测试用历史,才需要修改代码
- 确保每一行代码都是有目的的,避免过度设计
- 减少重复代码
- 高度模块化、高内聚、低耦合、高可用,防止未来的需求破坏模块可用性和造成新的缺陷
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!