关闭

对 Java 和 EJB 应用程序进行单元测试

发表于:2007-9-30 13:26

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Abraham WoldeMichael    来源:IBM

列表 5. 测试 Basic Calculator EJB 的 JUnit 源代码
	  package calculator.test;    
import java.rmi.RemoteException;
import com.ibm.etools.service.locator.ServiceLocatorManager;
import ejbs.BasicCalculator;
import ejbs.BasicCalculatorHome;
import junit.framework.TestCase;
public class BasicCalculatorTest extends TestCase {
BasicCalculator aBasicCalculator = null;
/*
* Setup before each test case
*/
protected void setUp() throws Exception {
super.setUp();
aBasicCalculator = createBasicCalculator();
}
protected void tearDown() throws Exception {
aBasicCalculator = null;
}
public void testSimpleAddition() throws Exception {
assertTrue("Calculator instance is not null", aBasicCalculator != null);
double result = aBasicCalculator.addTwoNumbers(2, 2);
assertTrue("2+2=4";, result == 4);
}
public void testSimpleAdditionNotSame() throws Exception {
double result = aBasicCalculator.addTwoNumbers(2, 2);
assertNotSame("2+2 does not = 5";, new Double(result), new Double(5));
}
public void testDesignedToFail() throws Exception {
double result = aBasicCalculator.addTwoNumbers(1, 1);
assertTrue("1 + 1 = 3";, result == 3);
} /*
* Rational generated code snippet to access EJB
*/
private BasicCalculator createBasicCalculator() {
BasicCalculatorHome aBasicCalculatorHome =
(BasicCalculatorHome) ServiceLocatorManager.getRemoteHome(STATIC_BasicCalculatorHome_REF_NAME,
STATIC_BasicCalculatorHome_CLASS);
try {
if (aBasicCalculatorHome != null) {
return aBasicCalculatorHome.create();
}
}
catch (javax.ejb.CreateException ce) {
ce.printStackTrace();
} catch (RemoteException re) {
re.printStackTrace();
}
return null;
}
private final static String STATIC_BasicCalculatorHome_REF_NAME = "ejb/BasicCalculator";
private final static Class STATIC_BasicCalculatorHome_CLASS = BasicCalculatorHome.class;
}

        利用 JUnit 对 EJB 进行单元测试
由于 EJB 都是由它们的容器管理的,所以它们必须在 JNDI 定位中可以查找到。单元测试可以是一个冗长乏味且艰难的过程。幸运的是, Rational Application Developer 提供了一些为开发者执行创建一个 EJB 实例任务的代码片段。

        无状态 session EJB 的计数器方法与 Java bean 的执行是一样的。因此,您可以为您的 EJB 单元测试重新使用基本的 JUnit 测试用例。但是您必须在 set() 方法中稍做变动,来对 EJB 对象进行定位和实例化。 您是否还记得一个 set() 方法的主要目的是对测试下的目标进行初始化。在这个方法中,需要调用 createBasicCalculator(),它返回了这个计数器的 EJB 实例。这个方法中的代码是由 Rational Application Developer 产生的。这个方法显示在 列表 6中。


列 6. 查找和访问 EJB 主页
                  
	  private BasicCalculator createBasicCalculator() {    	
BasicCalculatorHome aBasicCalculatorHome = (BasicCalculatorHome) ServiceLocatorManager
.getRemoteHome(STATIC_BasicCalculatorHome_REF_NAME,
STATIC_BasicCalculatorHome_CLASS);
try {
if (aBasicCalculatorHome != null) {
return aBasicCalculatorHome.create();
}
} catch (javax.ejb.CreateException ce) {
ce.printStackTrace();
} catch (RemoteException re) {
re.printStackTrace();
}
return null;
}
private final static String STATIC_BasicCalculatorHome_REF_NAME = "ejb/BasicCalculator";
private final static Class STATIC_BasicCalculatorHome_CLASS = BasicCalculatorHome.class; }

        步骤 5. 创建一个 JUnitEE 测试模块并对它进行配置

        在 WebSphere Application Server 软件中执行您的 JUnit 测试用例,您可以利用 JUnitEE 框架的优势。正如前面所提到的,JUnitEE JUnit 框架的延伸,它在应用软件服务器中执行测试,并利用 TestRunner 界面以 HTML 或者 XML 的形式来显示结果。这个部分展示了如何利用两个测试框架创建一个单一的可部署的且包含您的测试和一个 JUnitEE 测试服务程序的 Web archive (WAR) 文件来运行您的 Java 和 EJB 单元测试用例。

        在 Rational Application Developer 软件中创建一个 JUnitEE 测试模块是一个凭直觉的过程。

  1. 首先,在 Rational Application Developer 中创建一个动态的 Web 项目,命名为 BasicAddJUnitEEWeb。
  2. 通过将 junit.jar 和 junitee.jar 文件放置在 Web 项目的 WEB-INF/lib 位置,把它们放置在这个项目的类路径。
  3. 创建一个 jar 文件,命名为 BasicAddUnitTest.jar,包含这两个测试用例类。拷贝这个 jar 文件,BasicAddUnitTest.jar 到 WEB-INF/lib 位置。
  4. 包括以 web.xml 部署描述符形式显示在列表 7中的 XML 代码。

列表 7. 在部署描述符 web.xml 中的 JUnitEE 测试 servlet 的映射
                  
	  1.	<servlet>  
	  2.	  <servlet-name>JUnitEEServlet</servlet-name>  
	  3.	  <display-name>JUnitEEServlet</display-name>  
	  4.	    <servlet-class>org.junitee.servlet.JUnitEEServlet  
	  5.	    </servlet-class>  
	  6.	  <init-param>  
	  7.	      <param-name>searchResources</param-name>  
	  8.	      <param-value>BasicAddUnitTest.jar</param-value> 
	   </init-param>  
	  9.	</servlet>  
	  10.	<servlet-mapping>  
	  11.	   <servlet-name>JUnitEEServlet</servlet-name>  
	  12.	    <url-pattern>/TestServlet/*</url-pattern>        
	   </servlet-mapping>  

        JunitEE 测试用例能够在这个应用服务器环境中以智能的或者基本的模式来执行。使用智能的模式, JUnitEE TestRunner 可以自动对以 "Test" 或者 "Tests" 的测试类进行定位。智能的模式通过以部署描述符的形式对 JAR 文件具体命名来进行配置,如 列表 7中第6—8行所示。如果不止一个 JAR 文件,就用逗号来分隔。在 Servlet 初始化的过程中,这个容器可以通过一次调用 init 方法来激活这个 Servlet。这个 init 方法为 Servlet 实例初始化了一套参数。这个参数名 searchResources 在第七行中已经声明,在第八行中, BasicAddUnitTest.jar 的值分配给这个参数。因此,无论这个容器何时激活这个 JunitEEServlet, JUnitEE 都会在 BasicAddUnitTest.jar 文件中查找所有的测试类。

        智能测试模式的备选方案是基础测试模式。在基础测试模式中,TestRunner 仅仅执行详细列在 WEB-INF/testCase.txt 文件中的测试类,它是一个每行只包含一个 JUnit 测试用例名称的简易文件,如列表 8所示。


列表 8. 带有 JUnit 测试包和类名称的测试文件
                                  
	  com.ibm.junitee.sample.operation.test.BasicAddJavaTest  
com.ibm.junitee.sample.operation.test.BasicAddEJBTest

        在最后的步骤中,部署之前,确保构建路径和所有的 JAR 依存关系都在适当的位置。此外,确保 EAR 文件包含所有 JAR 文件的必要效用, JUnitEE Web 模块也一样要打包成一个 WAR 文件包。当完成这些之后,继续进入到下一个部分在 WebSphere Application Server 环境中部署您的测试。

        步骤 6.在 WebSphere Application Server 中部署并执行测试用例

        到目前为止,您已经完成了所有的基本工作,您拥有一个包含您的配置好并打包的 JUnitEE 测试模块的 EAR 文件 (是一个 WAR 文件)。在 Rational Application Developer IDE 中部署一个 EAR 文件也是一个凭直觉的过程,因此它将有益于稍后对这个系列的第 3 部分中的逐步示范的学习。

        当您在应用服务器上部署完 EAR 文件以后,打开您的浏览器并指向 JUnitEE Servlet 的 URL 地址。这个 URL 地址的形式是 http://<hostname>:<portnumber>/BasicAddJUnitEEWeb/TestServlet, 其中 BasicAddJUnitEEWeb 是 Web 上下文的名称,动态 Web 项目的名称和 TestServlet 是 JUnitEE TestRunner servlet。这个例子使用了 http://localhost:9080/BasicAddJUnitEEWeb/TestServlet。 图 1 显示了信息是如何在 J2EE 组件间交换的概念视图。


图 1. 组件的交互
Illustration of component interaction

        一次成功的运行将在 JUnitEE TestRunner 窗口中显示所有的测试,如 图 2 所描述的。这个屏幕显示了执行您的单元测试的不同方法。选择您喜欢的测试选项或者键入您测试套件的名称到适当的字段来开始运行测试用例。


图 2. JUnitEE TestRunner 屏幕
JUnitEE TestRunner screen capture

        如果配置或者 JNDI 名称查找都没有错误,test runner 就执行被选的测试并将结果显示在 JUnit Test Results 窗口。这个窗口提供了关于执行测试的综合信息。如果测试通过,它将用一个绿色的复选标记来表示。如果失败了,则用一个红色的 X 来表示。点击这个 X 则提供一些供调试用的线索信息。我们故意促成一个测试失败,观察 JUnit 如何来显示一个失败的测试,如 图 3所描述。


图 3. 失败测试的 JUnit Test Results 视图
Screen capture of JUnit Test Results for a failed test

        结论

        这篇文章中的例子展示了您如何通过利用 IBM 技术和开源的 JUnit 以及 JUnitEE 测试框架来交付准确的、高质量的 J2EE 应用软件,从而能够快速且容易地对 Java 和 EJB 应用软件的单元测试进行开发,配置以及执行。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号