锁定老帖子 主题:测试如何驱动开发
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-21
yananay 写道 要根据需求来写测试。
gigix的例子应该把需求写详细了,这样大家就明白了。 而 taowen 那个,根本就不是TDD的方式。完全就是过度需求。 例如客户只是想要一个过冬的棉袄,而且耐用就可以了。 你的测试只要保证它能过冬,而且耐用就足够了。 如果你非要给客户一个能过冬的,刀枪不入的,内置MP3,而且即使 到外太空也能使用的棉袄,那真是闲得没事干了。 也客户可能要的就是这个 只是现在没提, 那么现在就不要作 反正tdd的好处就是改起来没负担,快。 只有有了需求再改。。。成这个样子。 |
|
返回顶楼 | |
发表时间:2007-09-21
我感觉还是gigix的算是TDD吧,testShouldSplitSentenceIntoWords测试方法是他实现所需要的
|
|
返回顶楼 | |
发表时间:2007-09-22
yananay 写道 要根据需求来写测试。
gigix的例子应该把需求写详细了,这样大家就明白了。 而 taowen 那个,根本就不是TDD的方式。完全就是过度需求。 例如客户只是想要一个过冬的棉袄,而且耐用就可以了。 你的测试只要保证它能过冬,而且耐用就足够了。 如果你非要给客户一个能过冬的,刀枪不入的,内置MP3,而且即使 到外太空也能使用的棉袄,那真是闲得没事干了。 是不是过度需求,取决于用户。反转字符串这种库级别的方法,能够处理null和空白是很正常的需求。如果有这样的需求的话,我绝对是现写最简单的边界条件的。如果几个测试最后走的都是同一个路径的话,我在写的时候就会把他们合并掉或者删掉没有必要的那个的。 |
|
返回顶楼 | |
发表时间:2007-09-23
taowen 写道 yananay 写道 要根据需求来写测试。
gigix的例子应该把需求写详细了,这样大家就明白了。 而 taowen 那个,根本就不是TDD的方式。完全就是过度需求。 例如客户只是想要一个过冬的棉袄,而且耐用就可以了。 你的测试只要保证它能过冬,而且耐用就足够了。 如果你非要给客户一个能过冬的,刀枪不入的,内置MP3,而且即使 到外太空也能使用的棉袄,那真是闲得没事干了。 是不是过度需求,取决于用户。反转字符串这种库级别的方法,能够处理null和空白是很正常的需求。如果有这样的需求的话,我绝对是现写最简单的边界条件的。如果几个测试最后走的都是同一个路径的话,我在写的时候就会把他们合并掉或者删掉没有必要的那个的。 合并和删除一个测试要比添加困难的多,资源消耗也大的多。 |
|
返回顶楼 | |
发表时间:2007-09-25
解释得不错,只是我还有一个问题:
楼主在测试驱动过程中驱动出了一个split方法,但也许我不希望在这个提供句子反转的类里面同时暴露这个分割单词的方法,我想把它写成private的,那要怎么驱动才能避开它?直接驱动出反转功能吗?那样粒度可能就分得不好了。楼主觉得该如何做呢? |
|
返回顶楼 | |
发表时间:2007-09-25
至少应该是protected否则不太可能被测试到。。。
不过由于本人不太会写 protected 这个词 所以 都是不写前面的参数的。 如: void hiddenMethod(){ //todo } |
|
返回顶楼 | |
发表时间:2007-09-25
pf_miles 写道 解释得不错,只是我还有一个问题:
楼主在测试驱动过程中驱动出了一个split方法,但也许我不希望在这个提供句子反转的类里面同时暴露这个分割单词的方法,我想把它写成private的,那要怎么驱动才能避开它?直接驱动出反转功能吗?那样粒度可能就分得不好了。楼主觉得该如何做呢? 重构出一个SentenceSplitter类 |
|
返回顶楼 | |
发表时间:2007-09-25
gigix 写道 pf_miles 写道 解释得不错,只是我还有一个问题:
楼主在测试驱动过程中驱动出了一个split方法,但也许我不希望在这个提供句子反转的类里面同时暴露这个分割单词的方法,我想把它写成private的,那要怎么驱动才能避开它?直接驱动出反转功能吗?那样粒度可能就分得不好了。楼主觉得该如何做呢? 重构出一个SentenceSplitter类 |
|
返回顶楼 | |
发表时间:2007-09-25
抛出异常的爱 写道 gigix 写道 pf_miles 写道 解释得不错,只是我还有一个问题:
楼主在测试驱动过程中驱动出了一个split方法,但也许我不希望在这个提供句子反转的类里面同时暴露这个分割单词的方法,我想把它写成private的,那要怎么驱动才能避开它?直接驱动出反转功能吗?那样粒度可能就分得不好了。楼主觉得该如何做呢? 重构出一个SentenceSplitter类 不知道是哪条原则,不过想法是这样的: 一开始我只考虑怎么实现。我设计了一个split的功能,所以我给它写测试,然后实现它。实现完以后,我发现split显然不应该是StringReverser的功能,所以我重构它,把它抽取到SentenceSplitter类,并且把对应的测试也搬到SentenceSplitterTest。这个时候StringReverser的split方法只是一句直接的delegate,所以不需要测试,并且可以直接inline到reverse方法内部去。 (以上只是为了说明过程。实际上经过重构,split这个方法非常可能被重构到只剩下“sentence.split()”这么一句,然后直接inline,然后去掉split方法和对应的测试。) |
|
返回顶楼 | |
发表时间:2007-09-30
不好意思,新手,问一下啊。
LZ的Test2和Test3的区别在哪里? 听“抛出异常的爱”的解释似乎就是为了多测试一遍? |
|
返回顶楼 | |