最近两年由于敏捷社区的活跃TDD也受到了更多程序员关注。业内对TDD 争论一直没有停止有推崇的也有诋毁的,这个世界上没有那么绝对的事情 TDD存在必然有它适用的场景,在需要用到TDD的场合 我们把它用好就可以了。让我们一起来一段TDD之旅。
一、认识TDD
TDD(全称Test Driven Development)测试驱动开发,是一种软件开发的流程,其由敏捷的“极限编程”引入。其开发过程是从功能需求的测试用例开始,先添加一个测试用例,然后运行所有的测试用例看看有没有问题,再实现测试用例所要测试的功能,然后再运行测试用例,查看是否有case失败,然后重构代码,再重复以上步骤。
TDD的两个核心点:1、用测试用例覆盖所有的需求;2、在代码变动的时候不断重构
在敏捷中主张通过回顾会进行团队改进,其实TDD也是基于这个理念来进行开发设计。比如当你要完成一个CASE时,首先你要写一个测试用例,再去写具体的实现,最后偿试跑一下测试是否通过,接下来我们需要思考当前的代码结构是否还有更好的方式来实现。通过持续这个过程来保证当前的结构是最优的。我个人更愿景把TDD看成一种思考方式。
PS:网上有太多关于介绍TDD的文章了 我这里就不在多啰嗦了,下面我们用TDD的方式写一段代码让大家感受一下。
二、TDD 操练
题目:将一个数字字符串转换成一个整数。
在开始之前我先给大家介绍一个写测试用例的格式G(GIVE)W(WHEN)T(THEN)
Give:测试用例的测试说明。
When:具体测试条件。
Then:期望的测试结果。
接下来我们看看用TDD的方式怎么来实现这个题目。
1、首先们列出 需求的测试用例
当字符串为空时 返回数字 0
当字符串为“1576” 返回数字 1576
当字符串为“-875” 返回数字 -875
当字符串为“3147483647” 返回数字2147483647
当字符串为“-214748364899” 返回数字 -2147483648
当字符串中包含非数字字符时返回数字 0
好了 测试用例写完了,让我们依次来完成每一个case .let’s go
当字符串为空时 返回数字 0
测试用例
代码:(注 不要想太多,我们只为了完成第一个测试用例而写的代码)
运行结果(bingo 测试通过了 我们继续)
当字符串为“1576” 返回数字 1576
测试用例
代码:(嘿嘿 看到这个代码 有同学要开始 喷了 ,请不要着急 我们继续 往后看)
运行结果(bingo 测试又通过了 哈哈 你好像并不开心呢)我们继续
当字符串为“-875” 返回数字 -875
测试用例
代码:(看到这里如果 你还能坚持 我真的很感动 ,我们发现这里出现了太多的重复的代码,接下来我们应该怎么办 ? 对重构 TDD 最重的一个环节之一 让我们来重构这段代码 )
重构后的代码 这样是不是 看着顺眼一些了,我们看看能不能通过测试用例
出错了,这是为什么呢 我们瞧一下是 原来是 “-875” 没有转换失败 ,不怕我们继续修改代码。
我们加上了 一个对负数的处理 修改完成 让我们再 测试一下
bingo 三个测试用例都通过了 ,也许你会说 代码还有可以优化的空间 是的没错 但还是先把其它的测试用例先搞定再说
当字符串为“3147483647” 返回数字2147483647
测试用例:
我们先不改变人码 看看是否可以通过(我们跑一下单元测试)
oh my god 出错了 这是为什么呢 为什么和我们想的不一样的 ,我们来看看2147483647 是什么意思 ,原来是 Integer的最大值啊 ,下面我们来处理一下代码。
我们运行一下单元测试 (全部通过了 ,剩下的几个case 大家自己动手试一下了,实践是最重的 动手试试吧 )
三、总结
TDD 旅程 到此结束了,希望旅途中小伙伴对TDD有一个新的认识。TDD是一个不断迭代的过程,让你的程序结构清晰、合理。再重构的过程中 有大量的测试用例给你的代码进行保驾护航,你可以大胆的去修改 代码,尤其是 修改其它同学留下的代码 测试用例会显得更加重要。
注:TDD的两个核心点:1、用测试用例覆盖所有的需求;2、在代码变动的时候不断重构
网友评论