1.3 cactus单元测试
cactus单元测试工具是对junit框架的扩充,使junit的思想和便利同样用于Browser/Server web应用程序中的测试,具体的来说就是测试servlet,jsp和filter。 本节讲述cactus 单元测试原理,servlet测试用例的书写(jsp,filter的测试用例的书写请参照cactus文档),如何配置ant运行这样的测试。
cactus 单元测试原理

Cactus提供了好几个扩展JUnit Testcase的子类和相应的redirector,上面的工作原理图解释了cactus测试的工作原理。
其中YYYTestCase = ( ServletTestCase子类 | FilterTestCase子类 | JspTestCase 子类)
XXX我们写的testcase名字的后半部分。
下面我们分步骤解释在我们的cactus Testcase子类里头的每一个testXXX()方法的具体情况:
·JUnit 测试运行器调用YYYTestCase.runTest()方法。
·这个方法寻找 beginXXX(WebRequest)方法,如果找到则执行。
·传给beginXXX(WebRequest)方法的参数WebRequest 可用来设置 HTTP头, HTTP 参数,这些参数将被发送到第2步的 Redirector 代理。
·YYYTestCase.runTest() 方法打开连向Redirector 代理的HTTP 连接,beginXXX(WebRequest)方法设置的HTTP协议参数将被送到代理。
·Redirector 代理在服务端作为YYYTestCase的代理(其实我们的YYYTestCase被实例化两次,一次在客户端被JUnit 测试运行器实例化,一次在服务器端被代理实例化,客户端实例执行beginXXX() and endXXX()方法,服务端实例执行Junit 测试用例的方法setup(),testXXX(),and teardown())。
Redirector 代理有下列事情可做:
·用java的内省功能创建服务端实例;
·设置一些缺省对象;
·按照客户端实例的意愿创建session。
·执行Junit 测试用例的方法setup(),testXXX(),and teardown();
·我们的 testXXX()方法调用服务端代码来进行测试,使用assertEquals()方法对测试结果和预期结果进行比较,如果两者相符为测试成功,否则为测试失败;
·如果测试失败,Redirector 代理将捕获testXXX()方法抛出的的异常;
·Redirector 代理将异常信息返回给客户端的JUnit 测试运行器,JUnit 测试运行器可以生成测试报告;
·如果没有异常出现, YYYTestCase.runTest()方法寻找
endXXX(org.apache.cactus.WebResponse) endXXX(com.meterware.httpunit.WebResponse) (后者用在和httpunit集成·中) 方法,如果找到则执行。
·endXXX方法中,我们可以检查返回的HTTP 头, Cookies 和output stream ,这个检查可以借助于Junit的 assertEquals或者cactus提供的帮助类。
在这里需要提出的一点就是:代理不会去真正执行servlet,或filter,或jsp的代码,你需要在testXXX方法中调用或模仿这些代码。