这篇文章将为大家介绍TestNG这个新的测试框架的特性以及TestNG优于JunitX的地方
TestNG(Test Next Generation)顾名思义下一代的测试框架它是基于JSE的注释特性的而构建的轻量级的单元测试框架结构说起单元测试框架大家都会自然地联想到JUnit用过JUnitX的程序开发人员都会发现JUnit在提供了强大功能的同时也存在很多令人沮丧的地方其中一个问题就是JUnitx 在每个测试方法调用前和调用后都会调用setUp()和tearDown()的方法如果开发人员希望在不同的测试方法中重用同一个JDBC连接或者JNDI的Context的时候会觉得很不方便一般的解决这个问题的方法是使用静态方法而这样的话就必须小心并发控制的问题(多个线程访问共享的静态对象)除此之外JUnit X对于多线程测试也比较麻烦需要其他模块的支持
这篇文章将为大家介绍TestNG这个新的测试框架的特性以及TestNG优于JunitX的地方众所周知Eclipse不仅仅是功能强大的Java IDE同时也是一个开放的应用集成平台而Eclipse提供了对JSE的支持因此笔者将以Eclipse为运行环境介绍Testng的安装使用和运行Eclipse可以从下载
关于注释
由于TestNG是基于JSE的注释特性所构建的因此读者在阅读本文之前必须了解注释的一些基本概念关于JSE的注释特性笔者曾经在另一篇文章中详细的介绍过详细介绍请参考参考资料这里只简单的介绍一些概念
注释是JSE所新提供的对于元数据的支持程序开发人员可以在不改变原有逻辑的情况下在源文件嵌入一些补充的信息注释都是由@Interface annotationName 来声明的注释可以用来修饰类定义方法域变量等等使用的时候是在修饰的对象的定义前@annotationName注释可以包含多个属性使用的时候为属性赋值例如 @annotationName(prop=valueprop=value)程序的开发人员还可以通过Java的反射特性在运行时获得这些注释的信息在后面的章节中大家会看到TestNG是如何使用它所定义的注释类型的来实现测试框架的
安装TestNG
在Eclipse中安装testNG很简单和安装其他的plugin的方法相似首先启动Eclipse在Help>Software Update>Find and Install 在弹出的向导中选择Search New Features to Install 点击New Remote Site如图所示在URL中输入 点击OK如图所示点击FinishEclipse会帮助你完成下面的安装熟悉Eclipse的读者对这个过程一定不会觉得陌生
图 新建Update Site
educitycn/img_///jpg >图 安装TestNG
educitycn/img_///jpg >安装好TestNG后在Eclipse中单击Window>Show View>Other>Java>TestNG TestNG的视图就打开了
图 TestNG的视图
educitycn/img_///jpg>注意TestNG的视图的作用时为了现实测试结果为了显示视图的功能图的视图是运行了一个测试用例后的结果读者如果是第一次打开视图应该是空白的
一个简单的例子
TestNG和JUnit不同他使用注释正则表达式和基于XML的配置文件对测试方法进行配置的我们先来看一个简单的例子
) 在Eclipse中创建一个Java的项目comcatherinelabtestngdemo
) 在Packet Explorer中右键点击刚生成的项目选择Properties
) 在Properties属性框中选择Java Build Path点击Add External JARs…
) 在文件浏览的对话框中选择{eclipse home directory}/plugins/combeusttestngeclipse_XXX/eclipse_testngjar以及 {eclipse home directory}/plugins/combeusttestngeclipse_XXX/lib/testngjdkjar/以及testngjdkjar 点击OK
) 在Project中创建一个package: comcatherinelabtestngfirstTest在package里边创建一个类FristTestSample
清单 TestNG的第一个例子
package comcatherinelabtestngfirstTest;
import combeusttestngannotations*;
public class FirstTestSample {
public FirstTestSample() {
super();
}
@Test
public void testPass() {
assert true :This test should pass;
}
@Test
public void testFail() {
assert false : This test will fail;
}
@Configuration(beforeTestClass = true)
public void doBeforeTests() {
Systemoutprintln(invoke before test class!);
}
@Configuration(afterTestClass = true)
public void doAfterTests() {
Systemoutprintln(invoke after test class!);
}
}
) 在Eclipse中打开Run>Run如图所示 首先在选择使用TestNG的Project而后在选择编写了测试逻辑的Class点击Run测试结果就显示在TestNG的视图中了如图所示
图 配置运行TestNG的程序
educitycn/img_///jpg >图 TestNG的运行结果
educitycn/img_///jpg >这是一个完整的测试用例和JUnit不同TestNG中实现测试逻辑的类不需要继承任何父类测试方法也无需遵循testXXX的命名规则
TestNG的类是大家所非常熟悉的普通的Java类而在这个类中所有的被@Test这个注释所修饰的方法都会被当作测试方法来运行除了测试类之外TestNG还需要了一个配置文件用来配置测试过程以下是一个简单的配置文件testngxml
清单 testNG的配置文件
<!DOCTYPE suite SYSTEM dtd >
<suite name=My First TestNG test>
<test name=Hello Test!>
<classes>
<class name= comcatherinelabtestngfirstTestFirstTestSample />
</classes>
</test>
</suite>
testngxml可以配置测试套件<suite>类似于JUnit的TestSuite而<test>类似于JUnit中的TestCase所不同的是 TestNG中的测试套件可以包括多个测试用例一个测试用例可以包括多个测试类而一个测试类中可以定义多个测试方法在下面的例子中我们将看到这个配置文件更复杂的应用
在图的运行配置中我们也可以设置一个xml文件作为配置文件而不是直接使用测试类其实我们使用测试类的时候testNG也帮我们生成了一个缺省的xml文件不相信的话你可以切换到Resource Perspective然后刷新Workspace就会发现这个project里边生成了一个xml文件而这个文件就是TestNG的缺省的配置文件
现在我们再回到清单大家在上面的程序清单中会发现除了使用@Test这个注释以外我们还使用了@Configuration这个注释下面我们就来介绍@Configuration这个注释的用途
在注释Configuration中定义了以下的属性
清单 configuration中的属性
public boolean beforeSuite() default false;
public boolean afterSuite() default false;
public boolean beforeTest() default false;
public boolean afterTest() default false;
public boolean beforeTestClass() default false;
public boolean afterTestClass() default false;
public boolean beforeTestMethod() default false;
public boolean afterTestMethod() default false;
beforeSuite=true所修饰的方法将在测试套件(也就是配置文件中的Suite Tag)中任何一个方法调用之前调用一次
afterSuite=true所修饰的方法将在测试套件中所有方法都调用过后调用一次
beforeTest=true在测试用例(配置文件中Test Tag)中任何一个测试方法调用之前调用一次
afterTest=true 在测试用例中任何所有方法都调用之后调用一次
beforeTestClass=true在测试类中任何测试方法调用之前调用一次
afterTestClass=true在这个测试类中所有方法都调用过后调用一次
beforeTestMethod=true在每个测试方法调用之前调用一次
afterTestMethod=true在每个测试方法调用之后调用一次
这个清单中doBeforeTests()方法在任何一个test方法调用之前被调用一次doAfterTests就是所有的test方法运行过了以后再调用一次从Console输出的信息中我们可以验证这一点
图 console输出的运行信息
educitycn/img_///jpg >回页首
更复杂的例子
上一节中我们介绍了使用testNG的一个最简单的例子这一节中我们将介绍一些关于testNG的高级应用注释Test除了标志其修饰的方法为测试方法 还提供了groups的属性比如上面例子的两个方法testPass()和testFail()我们可以给这两个方法加上group的属性