测试驱动的开发是重要的
不知道各位有没有注意到这样一个变化,那就是现在大家都在谈论XP(eXtreme Programming)极限编程,但谈论终究还是谈论,目前真正在项目中实施XP模式开发的团队还占少数(国内)。我很庆幸我所在的团队是一个如此让我充满激情的团队,它让我们有机会用自己的行动去揭开极限编程的面纱。(无可否认,对于XP来说我们是纯粹的新手,实施XP开发得这些日子里,我们有时步履维艰,有时也想过放弃而采用传统的开发模式(那样似乎更合理),不过还好我们够有勇气(courage),我们不停的交流(communication)、交流、交流)
“简单设计、小迭代开发、配对编程以及XP的精华(交流、简单、反馈、勇气)”这些我自认为如果采用XP至少可以达到形似(呵呵,如果你说这种是披着XP的外衣,我也不反对,因为对于新的——尤其的好的事物,我们首先要“形似”,然后再求 “神似”),但是其中的“先测试后编码”我始终是XP模式中的重头戏(个人意见:))。
XP中强调测试驱动的开发(目前国内的书店可以找到XP的“鼻祖”之一 Kent Beck编写的《Test-Driven Development:By Example》影印版,你同样可以在我的站点http://plateau.sicool.com中找到该书的电子版,仅供学习使用),它强调具体的一个流程为:
“red/green/refactor”,如果你在XP中没有实施测试驱动的开发,那XP对你至少已经60%是一件漂亮的外衣了。
我之所以强调在XP中“测试在先”的重要性,是因为起初我跟你一样:可以对测试马上给出一个非常明确的认识——“那是项目后期的工作,当然也可以在项目中间阶段就开始测试,但是至少不是在还没有一句代码的时候,绝对不是!”。然而事实上我碰壁了,而且非常的痛。知道么?在第一个小迭代,我们根本不能把测试用起来,面对我们(XP强调代码共有)的代码(通过配对编程,目前的代码至少是整洁的、规范的),我没有丝毫的自信,就是说我不能说保证它总是能运行的,更别提重构(refactor)了。
在传统的开发模式中,重构要需要怎样的“小心”你根本无法想象!,然而为什么XP开发员却能够像“玩耍”一样对代码进行重构、重构再重构?因为他们(XP开发员)能通过各种各样的测试对自己的代码(重构以后的代码)有足够的理由自信它们是能运行的,这种自信是发自内心的,它让你更加热爱测试(love test)热爱重构(love refactor)、更加热爱这项运动(love this game!:))。
目前我们的项目中采用Struts+Hibernate开发,其中牵涉到的测试框架有:
1.StrutsTestCase
用于模拟struts环境来测试action.(它真的很有意思,特别对于熟悉struts的开发员来说)。
下面是strutstestcase.sourceforge.net上一段对它的描述:
StrutsTestCase for JUnit is an extension of the standard JUnit TestCase class that provides facilities for testing code based on the Struts framework. StrutsTestCase provides both a Mock Object approach and a Cactus approach to actually run the Struts ActionServlet, allowing you to test your Struts code with or without a running servlet engine. Because StrutsTestCase uses the ActionServlet controller to test your code, you can test not only the implementation of your Action objects, but also your mappings, form beans, and forwards declarations. And because StrutsTestCase already provides validation methods, it's quick and easy to write unit test cases
2.Cactus
用于测试servlet filter等等
以下是cactus(http://jakarta.apache.org/cactus/)官方发布文档中对其的说明:
Cactus is a simple test framework for unit testing server-side java code (Servlets, EJBs, Tag Libs, Filters, ...).
The intent of Cactus is to lower the cost of writing tests for server-side code. It uses JUnit and extends it.
Cactus implements an in-container strategy (See How it works).
3.HttpUnit
用于jsps的测试。
4.Junit(Erich Gamma和Kent Beck开发的测试框架)上边所提到的三种框架都是基于Junit的测试框架。
本文虽然重点在说测试,但是对于“test first,code later”并没有说明怎样才能更好的实施以及对于上边提及的测试框架也没有更深入的阐述,如果你对于测试驱动的开发非常关注,或者你现在正在被此类的问题困扰,我建议你能读读大师Kent Beck的那本不是很厚的书籍(本文前部分有说明),下一段时间我会根据项目中的使用情况,对于上述测试框架进行整理并给出实例化的文档。
摘自隐隐约约出现平常人诞生的故乡[http://plateau.sicool.com]
Jplateau 2003年11月5日星期三 写于广州