Aaron的测试生活小说

半两五钱,笃志向前
  首页  :: 新随笔  :: 联系 :: 管理

译释Dozen ways to find bugs(8)——Expand your toolbox

Posted on 2009-03-02 21:15  Aaron Wu  阅读(306)  评论(2编辑  收藏  举报

       英文原文名叫《A Dozen Ways to Get the Testing Bug in the New Year》,是Aaron在java.net上发现的文章。原文地址http://today.java.net/pub/a/today/2004/01/22/DozenWays.html,原文是在2004年1月22日发表的,按常理说一片早已经过了时效期的文章是没有多大用处的,但是Aaron却认为时至今日该文依然值得一阅。

     很多时候,直到我们要测试某个东西的时候才发现手头上并没有合适的工具。由于缺乏合适的工具,我们需要花费额外的时间在测试上,而当项目周期是固定的时候,相应的测试时间的压缩导致了测试范围/测试质量的缩水。开源世界现在为我们提供了很多开源的测试工具,我们可以不费吹灰之力就找到一个测试工具或组件。

     我们还是拿实现Shopping Cart服务的一个servlet例子来讲吧。我们需要添加一定量的某种货物,这些都是通过参数请求来实现的。我们需要测试这个servlet,但是我们需要测试的某个方法需要传递给它一个HttpServletRequest实例,而它的创建又是一件很麻烦的事情。如果我们还需要在运行测试之前将某个J2EE服务器准备好到某种规定的状态,事情就变得更加复杂了,而且这样的测试不能很频繁地运行。这个时侯我们就需要添加Mock Objects框架到我们的工具箱之中了。接下来的一个JUnit示例就是通过使用Mock Objects框架在J2EE服务器之外来帮助测试这个Serlvet

import junit.framework.TestCase;

import com.mockobjects.servlet.*;

public class ShoppingServletTest extends TestCase {

    public void testAddRequestedItem() throws Exception {

        ShoppingServlet servlet = new ShoppingServlet();

        MockHttpServletRequest request = new MockHttpServletRequest();

        request.setupAddParameter("item", "Snowboard");

        request.setupAddParameter("quantity", "1"); 

        ShoppingCart cart = new ShoppingCart();

        servlet.addRequestedItem(request, cart);

        assertEquals(1, cart.itemCount());

    }

}

    读者可以看到,我们在请求中使用了一个MockHttpServletRequest的实例,这个实例会被传递给SerlvetaddRequestedItem()方法。当运行测试时候,我们的Serlvet会“误认为”自己运行在一个Servlet容器中。在稍后的集成测试中,我们会涉及到更多的测试范围,这个时候我们可能会用到一个真实的servlet运行环境,但是至少在目前我们刚开始写Servlet代码的时候,使用Mock Objects可以帮助我们运行一个更快而且无害的测试。

     因此,当你准备重头开始自己写一个测试组件或者因为测试的工作量太大而放弃(部分)测试之前,你最好调查一下当前是否有合适的工具可以帮助我们解决这些问题。JUnit是一个框架而不是一个应用程序,因此当你发现JUnit自己包含的一些常用的断言(Assertoin)不够用的时候,我们还可以自己写一些自定义的断言。实际上,我们也可以写一些给予JUnit的应用程序(测试工具)。JUnit.org列出了当前已有的一些JUnit应用程序和插件。实际上,类似与JUnit,我们还可以在XProgramming.com上找到应用于其他语言的XUnit测试框架。如果这上面没有你想要的东西,你还可以到google上面搜索,你会找到更多的工具。当然,你也可以自己写一个测试组件,并且在网络上共享它,以帮助其他人扩展自己的工具箱。