`
snowmanjy
  • 浏览: 54316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

有关TDD(Test-Driven Development)和持续集成(Continuous Integration)

阅读更多


   在最近的工作中接触到了TDD,其实严格的说也不能算纯粹的TDD,不过test已经覆盖了大部分的代码功能点,持续集成方面采用的软件是anthill,当然还有CruiseControl可以选择。


   有关TDD和持续集成都足够独立成文,也有很多相关的介绍文章,这里只是简单描述下我们的做法:
     1。保证大部分功能点都有相关的test(因为某些原因,我们没有做到TDD要求的测试先行,有待以后改进)
     2。在ant脚本中加入JUnit test部分,目的是达到自动执行批量test并且能够test fail->build fail。
     3。在版本控制器(svn)上加上anthill的支持

    这样协作开发的步骤就是:从svn update 代码->首先进行cleanbuild确保修改前的代码是无错的->进行代码及相应test的修改(按照TDD这里的顺序应该是反过来)- >再次cleanbuild确保修改后的代码是无错的->svn commit->通过anthill web界面进行build查看结果
全部正确就算完成了一次修改,可以看出test和持续集成的作用,既保证了代码实时的正确性,又保证了trouble shooting的准确快速。


   无怪spring和pico的作者都提到TDD从某种程度上讲是致瘾的,习惯了它的开发者很难再回到原来的开发模式。想来一定是会感到缺乏安全感吧:)回想以前总是担忧自己项目中bug横行却无计可施的日子,恐怕真的离不开test了。



必要的软件:
  Eclipse-最重要的了,提供了对Junit和Refactoring的良好支持
  JUnit-使test细致到function一级,以清晰的红绿灯显示测试的结果
  Ant-支持自动化的test过程
  EasyMock-如果你使用MockObject协助test
  anthill(CruiseControl)-持续集成软件



推荐的参考读物:
http://news.csdn.net/news/newstopic/21/21164.shtml Martin Fowler:持续集成
Test-Driven Development A Practical Guide 测试驱动开发实用指南(中国电力出版社)jolt大奖得主哦
分享到:
评论
15 楼 kenny319 2006-11-05  
如果非要按照TDD的思想,当然应该是先重够测试的方法啊.事实上TDD应该只是一种思想或者规范
,一种可以标准化我们的开发流程和提高软件质量的思想.应该还是可以在自己的应用上变通的.
14 楼 tuti 2006-11-02  
私有方法都是为对外接口服务的,只要对外接口的功能正确,
又有谁来关心你的私有方法对还不对呢?

其实有没有这个私有方法,或者私有方法压根没被调用到,对这个类的调用者
而言,都是无所谓的.
13 楼 dogstar 2006-11-02  
就是私有方法,别的类不可以调用.但是,这个方法肯定也有自己的功能,需要去测试呀.我看了以前fireboy等讨论的tdd帖子,他把这个方法抽出去到一个类里,然后去测试.这样有点过度设计了.还有就是把这个方法变成非私有的去测试,这样又失去了封装性.哎,不懂,不懂...
12 楼 tuti 2006-11-02  
dogstar 写道
那如果我抽出了几个私有方法,就是助手方法,怎么测?

什么叫助手方法? 别的类可以调用吗?
如果 别的类可以调用,那就是改变了类的对外行为,可能需要测试.
如果 别的类不可见,也无法调用,那就是没有改变类的对外行文,也就不需要测试.
况且调用不到,又怎么测试呢?


详细的实践经验,可以看<测试驱动开发> (Kent Beck),书中有详细的例子.
11 楼 snowmanjy 2006-11-02  
dogstar 写道
tuti 写道


重构并不改变类的外部行为,所以一般情况下不需要写测试.只要保证原来的测试仍然通过就是可以了.



我的理解也是这样的. 如果改变方法的功能的话,估计那叫重做。哈哈

我目前写测试是:junit写的测试和方法对应。比如有do1 do2 那么对应就有testDo1 testDo2。如果按照tdd的话,就先写testDo1在写do1这样的顺序。如果我重构的话,只改变do1的代码,而没有改变功能,那么就不需要修改testDo1,那么按照你的说法肯定可行。那如果我抽出了几个私有方法,就是助手方法,怎么测?这些方法需要测吗?如果要测的话,那么方法肯定是先出来的,在写测试。这又与tdd有些矛盾了。 还是那里没有理解,还是太执着了tdd了?呵呵

希望有人可以详细介绍一下自己的实践经验


你这样一个方法一个测试是不够的,针对一个方法进行很多测试的情况很常见。我在文章中所提到的国外项目,针对一个方法用错误的参数调用是否会抛出期望异常等情况都有相应的test,不过在国内这只是理想了,毕竟项目进度在那里压着,bt的客户在拍着脑袋喊明天上线,所以能做到多全面的测试就说不准了。
10 楼 daquan198163 2006-11-02  
dogstar 写道
tuti 写道

重构并不改变类的外部行为,所以一般情况下不需要写测试.只要保证原来的测试仍然通过就是可以了.

我的理解也是这样的. 如果改变方法的功能的话,估计那叫重做。哈哈
我目前写测试是:junit写的测试和方法对应。比如有do1 do2 那么对应就有testDo1 testDo2。如果按照tdd的话,就先写testDo1在写do1这样的顺序。如果我重构的话,只改变do1的代码,而没有改变功能,那么就不需要修改testDo1,那么按照你的说法肯定可行。那如果我抽出了几个私有方法,就是助手方法,怎么测?这些方法需要测吗?如果要测的话,那么方法肯定是先出来的,在写测试。这又与tdd有些矛盾了。 还是那里没有理解,还是太执着了tdd了?呵呵
希望有人可以详细介绍一下自己的实践经验

好像是太较真儿了,跟着感觉走吧,让测试驱动着你去思考、设计
9 楼 daquan198163 2006-11-02  
tuti 写道
snowmanjy 写道
dogstar 写道
我想知道的是,tdd下如何Refactor.比如我写好测试,然后写好功能.然后重构,我把一个方法重构成几个小方法了,然后写测试?还是要重构方法之前,先重构测试?有经验的介绍一下吧...

按照tdd的思想,重构当然是先从测试开始。首先break掉test,再通过修改代码修复它。这样才是small step的测试先行啊。


重构并不改变类的外部行为,所以一般情况下不需要写测试.只要保证原来的测试仍然通过就是可以了.

一般情况下是地
当使用了mock测试的时候就是非一般情况吧,如果mock测试描述了被测试组件的内部行为,有时需要先对它进行修改
8 楼 dogstar 2006-11-02  
tuti 写道


重构并不改变类的外部行为,所以一般情况下不需要写测试.只要保证原来的测试仍然通过就是可以了.



我的理解也是这样的. 如果改变方法的功能的话,估计那叫重做。哈哈

我目前写测试是:junit写的测试和方法对应。比如有do1 do2 那么对应就有testDo1 testDo2。如果按照tdd的话,就先写testDo1在写do1这样的顺序。如果我重构的话,只改变do1的代码,而没有改变功能,那么就不需要修改testDo1,那么按照你的说法肯定可行。那如果我抽出了几个私有方法,就是助手方法,怎么测?这些方法需要测吗?如果要测的话,那么方法肯定是先出来的,在写测试。这又与tdd有些矛盾了。 还是那里没有理解,还是太执着了tdd了?呵呵

希望有人可以详细介绍一下自己的实践经验
7 楼 tuti 2006-11-02  
snowmanjy 写道
dogstar 写道
我想知道的是,tdd下如何Refactor.比如我写好测试,然后写好功能.然后重构,我把一个方法重构成几个小方法了,然后写测试?还是要重构方法之前,先重构测试?有经验的介绍一下吧...

按照tdd的思想,重构当然是先从测试开始。首先break掉test,再通过修改代码修复它。这样才是small step的测试先行啊。


重构并不改变类的外部行为,所以一般情况下不需要写测试.只要保证原来的测试仍然通过就是可以了.
6 楼 snowmanjy 2006-11-02  
dogstar 写道
我想知道的是,tdd下如何Refactor.比如我写好测试,然后写好功能.然后重构,我把一个方法重构成几个小方法了,然后写测试?还是要重构方法之前,先重构测试?有经验的介绍一下吧...

按照tdd的思想,重构当然是先从测试开始。首先break掉test,再通过修改代码修复它。这样才是small step的测试先行啊。
5 楼 partech 2006-11-02  
实际项目中,完全做到TDD,也不容易啊。
主要是里面不明确的东西,有点多。
4 楼 dogstar 2006-11-02  
我想知道的是,tdd下如何Refactor.比如我写好测试,然后写好功能.然后重构,我把一个方法重构成几个小方法了,然后写测试?还是要重构方法之前,先重构测试?有经验的介绍一下吧...


怎么提交了两次,建议加一个删除功能.
3 楼 dogstar 2006-11-02  
我想知道的是,tdd下如何Refactor.比如我写好测试,然后写好功能.然后重构,我把一个方法重构成几个小方法了,然后写测试?还是要重构方法之前,先重构测试?有经验的介绍一下吧...
2 楼 snowmanjy 2006-11-02  
edge_hh 写道
谢谢楼主的分享。

进行代码及相应test的修改(按照TDD这里的顺序应该是反过来)

为什么不按照tdd的顺序呢?
是因为先改代码更方便?


还是编程习惯问题吧,软件工程中测试总是排在开发后面不是么,呵呵
1 楼 edge_hh 2006-11-01  
谢谢楼主的分享。

进行代码及相应test的修改(按照TDD这里的顺序应该是反过来)

为什么不按照tdd的顺序呢?
是因为先改代码更方便?


相关推荐

Global site tag (gtag.js) - Google Analytics