开源软件测试框架的使用说明

发表于:2009-03-03来源:作者:点击数: 标签:软件测试框架开源
它向您展示了如何使用一个 开源 测试框架,比如 JUnit 和 JUnitEE,通过在 IBM WebSphere Application Server 环境中使用 IBM Rational Application Developer 来进行 Java 和 EJB 应用软件的 单元测试 。 对 J2EE 组件进行单元测试的理由 当我们逐渐趋于一种
它向您展示了如何使用一个开源测试框架,比如 JUnit 和 JUnitEE,通过在 IBM WebSphere Application Server 环境中使用 IBM Rational Application Developer 来进行 Java 和 EJB 应用软件的单元测试
        对 J2EE 组件进行单元测试的理由
        当我们逐渐趋于一种分布式,多层次以及异构计算时,Java2 platform, Enterprise Edition (J2EE) 技术已经在开发基于组件的多层次,异构、分布式企业开发软件中变得十分普遍了。J2EE 技术已经集成了应用客户程序和小程序、Web 组件(JSP 和服务系统),以及 Enterprise JavaBeans(EJB) 组件。 Web 和 EJB 组件运行在一个应用软件服务器上,比如 IBM WebSphere Application Server 软件设备。就像人们使用 J2EE 技术来开发大型的、复杂的企业应用软件一样,各种不同的组件必然会紧密组合在一起来产生一个集成的应用软件。 
        在这些集成发生之前,必不可少的也是十分关键的是要对每个组件分别进行严格的单元测试。有效地对每个组件进行独立的单元测试可以减少错误,并有助于确保高质量的软件。有些开发人员或者测试人员可能会提出这样的争议:对J2EE 组件进行单元测试太浪费时间,需要高密度人力资源,并且易于出错。尽管深入研究各种 J2EE 组件的单元测试已经超出了这篇文章的范围,但是它将向您说明用JUnit 和 JUnitEE 测试框架对 EJB 组件进行单元测试是如何的简单而有效。
        单元测试对于一个开发人员来说仅仅是编写代码的问题,它只发挥了被测试代码中一个很小且很特殊部分的功能。通常情况下,一个单元测试在特殊环境下只测试一些特殊的方法,因此它将白箱测试分为更广泛的种类。由于对 J2EE 组件进行单元测试的需求变得越来越明显,开发者们已经开始利用 JUnit 测试框架的优势来执行这些测试。JUnit 测试框架最初是4由 Enrich Gamma 和 Kent Beck 编写的,是一个对客户程序端的 Java 应用软件进行单元测试的框架。它有以下几个优点: 
在 Java 中编写自动化和自我验证测试的简单框架 
支持测试断言 
测试集开发 
提供及时的测试报告 
        JUnit 提供了一个基于测试的命令行,同时还提供了基于 AWT 和基于 Swing 的图形化测试报告机制。IBM Rational Application Developer 集成开发平台(IDE) 包括 JUnit。
        然而,对于想要在应用软件服务器的容器中进行单元测试,以及想要以 HTML 或者 XML 的形式显示的开发人员来说,这个 JUnit 框架显得非常有限,且工作效率低下。这就是为什么 JUnitEE,一个开源开发组,要通过执行那个能够让您在应用软件服务器的容器里运行 JUnit 单元测试的 JUnitEE 测试框架来扩展 JUnit 能力的原因。 
        关于本系列文章
        这个系列的三篇文章向您阐述了怎样利用 IBM 工具和技术,通过使用 JUnit 和 JUnitEE 测试框架来对 Java 应用软件,EJBs 和 Web 服务进行单元测试。  [Page]
第 1 部分 (此篇文章)是以 JUnit 和 JunitEE 的概述开始的,然后展示了 JUnit 和 JUnitEE 在 Rational Application Developer IDE 中的用法,即如何对一个简单的 Java 应用软件和一个无状态的 session bean 进行单元测试。首先,我们介绍了 JUnit 和 JUnitEE 结构的简单概述,紧接着我们介绍了如何在 JUnit 和 JUnitEE 测试框架中开发,配置以及安装单元测试。最后,我们阐述了如何在应用软件服务器环境中布署和执行单元测试。 
第 2 部分 讨论了通过利用 Rational Application Developer 平台中的 JUnit 和 JUnitEE 测试框架对 Web 服务进行单元测试的问题,同时还讨论了如何在 IBM WebSphere Application Server 环境中布署和执行单元测试。 
第 3 部分 建立在第 2 部分的讨论的基础之上,提供了关于如何开发、部署,以及利用 JUnit 和 JUnitEE 测试框架在 Rational Application Developer 平台进行单元测试,然后如何在 IBM WebSphere Application Server 环境部署和运行测试的逐步指南。 
        必要条件
        要想从这篇文章受益,您需要对 Web 服务和 Rational Application Developer 有基本的了解。IBM developersWorks Web 网站和这篇文章末尾部分的 参考资源 提供了介绍性的材料。 
        这个指南是利用 JUnitEE Version 1.10 和 Rational Application Developer Version V 6.0.2 的最终版本开发和测试的。针对这个例子您可以下载 Rational Application Developer 的试用版本和双重文件(请看 资源)。
        JUnit 测试框架
        JUnit 现在是基于 Java 应用软件单元测试的非官方标准。尽管 Junit.org Web 网站提供了更多有压缩力的信息和指南(请参见 参考资源),这个部分还是向您提供了 JUnit 测试框架的总的观点。包含 JUnit 的装配 APIs 的主要目的是使 Java 单元测试用例的编写更快更简单。最低限度,一个 JUnit 测试用例有一个如 列表 1代码中所示的常用结构。

列表 1. JUnit 常用结构
1. Import junit.framework.TestCase;  
2.   
3. Public class AddJavaTest extends TestCase { 
4.   
5. protected void setUp() throws Exception  
6.     {  
7.      // create some object  
8.     }  
9. protected void tearDown() throws Exception  
10. {  
11.  //release any recourse that was created in          12.   setup()  
13. }   
14.      public AddJavaTest (String name){  
15.            super (name);   [Page]
16.   
17.      public void testSimpleAddition (){  
18.             assertTrue (expect == actual);  
19.    } 

 

        如 列表 1 第三行所示,所有的 Java 测试用例类都必须扩展junit.framework.TestCase ,它是 JUnit 的核心类。在第五行中,TestCase.setUp() 被重载,从而对测试下的对象进行初始化或者实例化。相反,在第九行中, TestCase.tearDown() 被重载,是释放任何定位资源的。在第十四行中,为了在日志中显示这个测试用例的名称,一个测试用例必须有一个可以将自变量传递到它的父类 (TestCase) 的专门的串参数构造器。 
        测试用例必须声明为 public void ,并且不带行参。此外,合适的是测试方法名称都有一个 \"test\" 前缀,这样测试运行人员就可以自动地执行所有的方法。最后,在第十八行的断言语句中,决定了这个测试用例的成功与失败。这个方法 assert在这个特殊的测试情景下,将期望值与实际值进行了对比。您可以利用 fail() 方法强迫这个测试用例失败,例如您想要迫使一个操作暂停。JUnit 提供了一个额外的决定测试用例成功或者失败的机制。表格 1 显示了不同 assert 和 fail 方法签名的范例。

表格 1. Assert 方法
static voidassertEquals (boolean expected, boolean actual) 
Asserts that two booleans are equal.
static voidassertFalse (boolean condition) 
Asserts that a condition is false.
static voidassertNotNull (java.lang.Object object) 
Asserts that an object isn’t null.
static voidassertNotSame (java.lang.Object expected, java.lang.Object actual) 
Asserts that two objects refer to the same object.
static voidassertNull (java.lang.Object object) 
Asserts that an object is null.
static voidassertSame 
(java.lang.Object expected, java.lang.Object actual) 
Asserts that two objects refer to the same object.
static voidassertTrue (boolean condition) 
Asserts that a condition is true. 
static voidfail (java.lang.String message) 
Fails a test with the given message.
static voidfailNotEquals 
(java.lang.String message, java.lang.Object expected, java.lang.Object actual)
private static voidfailNotSame 
(java.lang.String message, java.lang.Object expected, java.lang.Object actual) 
private static voidfailNotEquals 
(java.lang.String message, java.lang.Object expected, java.lang.Object actual) 
private static voidfailSame (java.lang.String message) 
(package private) static java.lang.Stringformat (java.lang.String message, java.lang.Object expected, java.lang.Object actual)  [Page]


        注意: Assert 类包含许多不同的重载方法。下面是一个完全重载 Assert 类方法的完整列表,请看页面 JUnit.org(参见 参考资源)。
        JUnit 提供了一个 TestRunner 类来执行测试用例。其实测试用例的方法多种多样。测试报告是利用图形和文本来显示的。要获取最受欢迎的图形结果,可以利用 junit.swingui.TestRunner 和 junit.awtgui.TestRunner。其次受欢迎的基于文本的结果,可以 利用 junit.textui.TestRunner 来取代。 
        此外, JUnit 测试用例可以从 Rational Application Developer 的IDE 运行或者在 Ant 构成脚本中自动运行。 
        JUnit 还通过利用 junit.framework.TestSuite 类提供了一种将测试归组为测试套件的方法。一个测试套件是由您能够在相同时期运行的相关测试组成的。下面有两种 JUnit 运行测试比较便利的方法:
对于第一种方法,您可以通过使用这个命令将测试用例传递到 TestSuite 构造器:
TestSuite suite= new TestSuite(testAddJava.class) 在这种情况下,TestRunner 将所有带测试前缀的测试程序挑选出来,然后自动运行每一个测试用例。 
另一个可选的方法是,通过使用 TestSuite.addTest 方法添加每个测试用例:
TestSuite suite = new TestSuite(); suite.addTest(new AddJavaTest(\"testSimpleAddition\")); 
        JUnitEE 测试框架
        JUnit 提供了一个对客户端 Java 应用软件进行单元测试的有效且简便的方法,但是它仍有一些局限性;因此,在每一个应用软件服务器的容器中进行测试变成了一个冗长且乏味的过程。IBM Rational Application Developer 平台提供的 Web-based Universal Test Client (UTC) 特性为 Enterprise JavaBeans (EJBs) 提供了一个无缝的完整的单元测试机制。然而,Rational Application Developer UTC 是一个交互式的单元测试机制,因此当进行自动单元测试时它显得有些不足。 
        JUnitEE 测试框架就是解决这些局限性的,同时还处理这个冗长而乏味的过程。这个框架延伸了标准的 JUnit,从而使它能够在应用服务器容器中执行单元测试。它在单元测试软件的 J2EE Web 模块中配置,利用 TestRunner 输出 HTML 或者 XML 测试结果。它还包含一个登陆到 JUnit 测试用例登陆口的 TestServlet。因此,根据 JUnitEE.org 的说法, 将您的测试工具构建为一个标准的 J2EE Web 有以下几点好处: 测试在 J2EE Web 模块中已经打包(以 WAR 文件的形式),这样便于部署和执行。 

原文转自:http://www.ltesting.net