本文共 2538 字,大约阅读时间需要 8 分钟。
UTDD
在代码层次,在编码之前写测试脚本,可以称为单元测试驱动开发(Unit Test Driven Development,UTDD)
ATDD
在业务层次,在需求分析时就确定需求(如用户故事)的验收标准,即验收测试驱动开发(Acceptance Test DrivenDevelopment,ATDD)
UTDD核心可看做一个闭环:RED -> GREEN -> REFACTOR,即运行一个失败的测试 -> 让测试通过 -> 及时重构代码。
传统编码方式
- 需求分析,想不清楚细节,管他呢,先开始写
- 发现需求细节不明确,去跟业务人员确认
- 确认好几次终于写完所有逻辑
- 运行起来测试一下,靠,果然不工作,调试
- 调试好久终于工作了
- 转测试,QA 测出 bug,debug, 打补丁
- 终于,代码可以工作了
- 一看代码超级烂,不敢动,动了还得手工测试,还得让 QA 测试,还得加班…
UTDD 编码方式
先分解任务,分离关注点
列 Example,用实例化需求,澄清需求细节
写测试,只关注需求,程序的输入输出,不关心中间过程
写实现,不考虑别的需求,用最简单的方式满足当前这个小需求即可
重构,用手法消除代码里的坏味道
写完,手动测试一下,基本没什么问题,有问题补个用例,修复
转测试,小问题,补用例,修复
代码整洁且用例齐全,信心满满地提交
他的引入也是有代价和风险的:
比如我们要写实现一个功能,当输入值大于等于0时返回true,当输入值小于0时返回false。
import org.junit.jupiter.api.Test;public class Test02 { @Test public void test01(){ // given int input = 1; // when boolean result = Equal01(input); // then assert result: "测试不通过"; System.out.println("测试通过,参数大于0"); } private boolean Equal01(int input) { return false; }}
先不管任何设计啥的,只要让测试过了就行,随便乱写。比如下面的的代码。
public class Test02 { @Test public void test01(){ // given int input = -1; // when boolean result = Equal01(input); // then assert result: "测试不通过"; System.out.println("测试通过,参数大于0"); } private boolean Equal01(int input) { if(input >= 0){ return true; } return false; }}
在业务层次,在需求分析时就确定需求(如用户故事)的验收标准,即验收测试驱动开发(Acceptance Test DrivenDevelopment,ATDD)
转载地址:http://wtmo.baihongyu.com/