测试驱动开发

在这次开发安全组件的过程中,全程使用的测试驱动开发,相比经往的测试驱动开发,虽然都是同样先写测试后写代码,但感觉以前只是形似而神不似。通过这次开发算是真正的有了一个好的开端吧。先将自己对测试驱动开发的感想写这样里方便以下自己查阅。使用了测试驱动开发后我感觉到的好处是:
1、代码的分散实现。以前可能需要实现很多的函数和很多的类后,再通过使用功能来检查其中代码是否运行正常,这就让我必须同时关注很多的内容,而通过测试驱动开发可以让我同一时间只关注一个类的实现,不必须关心其它的实现,这一点真是太爽了。上周四我实现一个ActivityPermission的类,需要支持IPermission接口,通过一步一步的测试和实现让我在下班之前就完成了这个类,并且我很放心这个类会正常的工作,而不必等到使用时。
2、便于得到简单的设计:我感觉自己在没有开发程序之前会对这个程序想很多种情况,让自己头都想痛了。会设计很多接口来表现出自己对设计很在行,水平很高。但通过测试驱动开发让我只面要解决当前的问题,前方发现一个山头,冲过去。再发现一个再冲,而不必在没有发现一个同头时为自己设计10个山头。
3、测试便于重构:不必多说,重构是测试的一个过程。
4、测试便于交流:测试中的代码可能是自我说明性最强的代码,如果我要测试A?? > Abc 我就会直接写一个测试方法名字就中 测试A两个问号大于Abc,而其中的第一个类的变量名就叫做:A两个问号再设置相应的值ABC相同来进行比较。简直就是代码版的API帮助文件。
5、测试有利于设计:当我在进行一个设计时最初的想法很可能是朦胧的,但通过测试不断的修正我的想法不断的强化各种概念,等所有功能都完成了,再来检查代码看那里不顺眼,再修改它而不必担心会破坏代码。
目前只感受到这么多。

而对于什么部分进行测试我认为有以下方面:
测试接口的契约:如在编写安全组件时我定义了一个用于进行授权检查的

IAuthorizationProvider.Authorizate(IIdentity identnty,string[] activityNames);

接口方法,其中我定义了一个契约当identity是null时将引发ArgumentNulLException异常。这里我对于这个方法的第一个测试就是测试这个参数不能为空。

测试心中的不快:有很多代码在进行设计的时候就在想怎么来进行操作,而编写完成后又感觉到一些方法可能会有问题,这时候心中就会有一种不放心,让自己担心掉胆,长此以会定会对身体产生不适。那么现在行动起来让编写一个测试让自己放心,解决自己的身体。

测试对代码的假设:这种测试可能会只有一个测试也可能会有10个测试,在编写GenericValueToken时为了相互的比较性我测试了:ab + a? = a? a? + a* = a,a?? + a? = a??等5种以上各种情况的测试,对每一种结果都编写一个测试。

不要因为实现简单就不进行测试:不能因为认为简单就不进行测试,因为很多情况下一组简单的测试形成一个测试组,这一组测试很有可能是在不同层面上来验证假设。如果不进行测试那么这就很有可能会产生问题。

如果使用三角法进行测试:三角法测试看起来是一种比软SB的一种测试方法,将同一代码用不同的数据执行两次。但三角法也有很重要的作用,特别是在进行简单问题的测试时,如果只进行一次可以直接返回一个常量值可能就满足要求了,但如果使用三角法就不能这样做了。
所以我认为三角法主要用于检查简单功能的测试,因为针对于一个复杂的问题可能会编写多个测试从多个方面来进行验证,而进行测试简单的功能通过只需要一个测试。

一定要失败/成功/重构的方式来进行整个开发过程,在实际的过程中我发现这样做的好处有以下作用:
一:测试测试代码自身的有效性:在开发中我有一个问题是测试身份验证时密码不正确时返回空,我发现当我直接返回一个null值时,我怎么也不能将这个测试红起来。这就说明这个测试可能自己就有问题,应当合并到密码正确返回有值,而错误返回空值。
二:减少不必须要代码:如在进行契约的验证时当参数为null时引发ArgumentNullException,但通过测试发现其中根本就不必写这个代码,因为可能实际上一个信赖的方法进行了这种检查(不知道这样好不好)。

虽然测试驱动开发有很多好处,但在实际中,当我正编写问题的测试过程中,我发现我完全忘记了整个的设计,而我又是不喜欢写文档的。完成一个类的开发后,我总需要思考一下自己的以前的设计(不知道这是好是坏)。

posted on 2008-06-12 16:40  蓝色游骑兵  阅读(338)  评论(0编辑  收藏  举报

导航