虽然Junit自身就可以通过编写单一类的测试程序对服务器端JAVA代码进行测试,不过,有了HTTPUNIT的帮助,Junit就可以扩展为模拟Web浏览器—Web服务器的工作方式对整个Web程序结构进行测试。本文就是教会你如何利用HTTPUNIT完成以上目标。
关于JUnit
下面的文章可供你了解更多有关Junit的信息:
HTTPUNIT的显著特点是它可以测试整个Web应用程序而非单个页面,由于它可以获取表单信息和cookie,所以你可以编写覆盖整个会话过程的测试程序。比方说,假如你的Web应用程序包含了一个购物车,那么你可以写个测试程序执行登录测验,选择商品并把它放到购物车里。由于测试程序是用JAVA编写的,所以测试的深度没有任何限制。现在就让我们举个简单的例子说明HTTPUNIT测试过程。
由于HTTPUNIT能够模拟整个会话过程而不仅仅只能模拟单一的请求,所以系统采用了WebConversation来管理所有的请求、处理cookies以及解析相对URL。在你编写复杂测试程序的情况下,
WebConversation类就显得更重要了。在清单A中,该类创建了一个发往URL base_url的请求。该请求的响应被存放起来,而Junit的方法assertEquals()会检测响应是否是200,这表示HTTP成功响应请求。
只要向Web服务器发出了成功的请求,下面就该解析请求的结果了。HTTPUNIT采用JTidy包(包含在HTTPUNIT分派版本中)把产生的HTML解果解析为DOM(文档对象模型)树。对那些不太熟悉DOM树的人来说,它们则提供了一种统一的方式采用层次数据结构处理文档。而Jtidy则提供了处理HTML结果的标准方式。
清单B 显示如何导航DOM树来查询结果中的特定文本。我们的例子首先打印出DOM 树,然后检查HTML表单中是否存在可选项。在这种情况下就是查找Tomcat附带的购物车(Shopping Cart)示例中是否存在选项“JSP
Book”。采用DOM是在文档树中找出特定文本的唯一方式。
不过你可得注意了,Jtidy构造的DOM树代表了文档所应该具有的结构而不是它的实际结构。这就是说,Jtidy可能会在HTML源代码中给文档树添加本应该存在但实际上不存在的结构元素。比如head和body标记、font标签等等。遍历DOM树并把输出结果可视化也许会对你有所帮助,正如程序B所显示的那样。清单C显示的是清单B中的SimpleDOM的结果。
正如你从清单B中所看到的那样,导航DOM既困难又耗费时间。幸而HTTPUNIT包含了快速处理某些HTML元素的工具。在程序D中,我们通过WebResponse对象返回WebForm对象列表的方式完成了同一任务。我们首先选择第1个WebForm然后检查可选列表“item”中是否存在选项“JSP
Book”。HTTPUNIT针对DOM树的表单和表而包含了一些快捷方式。
HTTPUNIT的功能还不止是仅仅解析单一连接的结果。其真正的强大功能在于能通过WebConnection对象发出多个请求。提出多个请求的最简单方法是跟踪HTML链接。在清单E中,我们编写了一个简单的客户程序跟踪有“Execute”字样的第1个链接。
到目前为止,HTTPUNIT的最常见用途就是测试填写表单之后的结果。当我们再度用到先前示例的情况下,我们可以检查表单中填写的内容是否符合希望的条件。WebConversation对象保证所有的链接和所有的cookies都在会话中被检测。在程序F中,我们在购物车中加入了全部项目并打印出结果从而测试了这一简单的购物车程序。每一个请求都采用了同一WebConversation对象,这样就保证了cookie值都是完全一样的从而模拟了整个会话过程。测试的输出结果包含了来自服务器的所有header,因此你可以查看cookie是否只被服务器发送了一次。
清单F同其他例子不同之处在于它利用了HTML表单而不是仅仅跟踪链接。该示例用setParameter()方法跳虫每个HTML表单并把它提交给服务器,其行为同真实的Web浏览器是完全一样的。
现在你已经创建了解析HTML、跟踪链接和操作表单的测试类,接下来你就可以开始为自己的Web应用程序创建测试案例了。