|
|
JUnt
是JAVA语言事实上的标准测试库。JUnt
4是三年以来最具里程碑意义的一次发布。它的新特性主要是针对JAVA5中的标记(annotaton)来简化测试,而不是利用子类、反射或命名机制。本文将讲述如何使用JUnt
4,当前前提是你最好具有JUnt的使用经验.
JUnt,
由Kent
Beck
和
Erch
Gamma开发,几乎是JAVA开发最重要的第三方工具。正如Martn
Fowler
所说,“在软件开发领域,从来就没有如此少的代码起到了如此重要的作用“。由于JUnt,JAVA代码变得更健壮,更可靠,BUG也比以前更少。由于JUnt
(由Smalltalk's的SUnt得来)
的出现,随后产生了许多xUnt的测试工具,如nUnt
(.NET),
pyUnt
(Python),
CppUnt
(C++),
dUnt
(Delph)
和其它不同平台及语言的测试相关的工具。
虽然JUnt也只是一个工具,但其产生的思想和技术却较其架构更意义重大。单元测试,测试先行的编程方式,测试驱动的开发方式,并非必须由JUNT实现,也不一定要用SWng实现GU界面。JUNT最近的一次更新是在三年前,但它比其它大多数有BUG的框架都要健壮,更重要的是,JAVA一直在改进。现在JAVA支持泛型,枚举,可变长度参数,以及标记语言(开创了开发可重用框架的新局面)。
JUnt's的停滞不前使得那些想要变革的开发人员换其它测试工具.挑战者有bill
Venners的Artma
SuteRunner和Cedirc
Beust的TestNG.这些工具库虽然有值得推荐的功能,但没有任何一款的地位能与JUNT相比,没有任何一款工具被其它业界产品如Ant,
Maven,
Eclpse广泛支持.因此Beck
和Gamma双开始利用JAVA5的新特性来开发新版的JUNT,目的是利用JAVA5中的标记特性使得单元测试开发更容易。Beck说:“JUNT4的主要目的是通过简化JUNT的使用鼓励更多的开发人员写更多的测试”。虽然会与以前的版本兼容,但JUNT4与从JUNT1.0就开始的版本相比会有一个非常大的变化.
注意:
修改基本框架是一把双刃剑,虽然JUNT4的目的是清晰的,但细节仍有许多不同,因此本文只是一个简单的介绍,并不是最终文档.
测试方法
以前所有版本的JUNT都使用命名机制和反射来定位测试,下面的代码测试1+1=
2:
| import
junt.framework.TestCase;
publc
class
AddtonTest
extends
TestCase
{
prvate
nt
x
=
1;
prvate
nt
y
=
1;
publc
vod
testAddton()
{
nt
z
=
x
+
y;
assertEquals(2,
z);
}
} |
而在JUNT
4中,测试方法由
@Test
标记说明,如下:
| import
org.junt.Test;
import
junt.framework.TestCase;
publc
class
AddtonTest
extends
TestCase
{
prvate
nt
x
=
1;
prvate
nt
y
=
1;
@Test
publc
vod
testAddton()
{
nt
z
=
x
+
y;
assertEquals(2,
z);
}
} |
使用标记的好处是你不用将所有测试方法命名为
testFoo()
,
testBar()等等以"test\"开头的方法,下面的方法也同样可以工作:
| import
org.junt.Test;
import
junt.framework.TestCase;
publc
class
AddtonTest
extends
TestCase
{
prvate
nt
x
=
1;
prvate
nt
y
=
1;
@Test
publc
vod
addtonTest()
{
nt
z
=
x
+
y;
assertEquals(2,
z);
}
} |
下面的代码也同样正确:
| import
org.junt.Test;
import
junt.framework.TestCase;
publc
class
AddtonTest
extends
TestCase
{
prvate
nt
x
=
1;
prvate
nt
y
=
1;
@Test
publc
vod
addton()
{
nt
z
=
x
+
y;
assertEquals(2,
z);
}
} |
这种命名机制最大的优点是更适合你的待测试类或方法名称,例如,你可以使用LstTEst.contans()测试
Lst.contans()
;使用LstTest.addAll()测试
Lst.add()等等.
TestCase
还可以继续使用,但你没有必须再扩展为子类,只要你声明了@Test,你可以将测试方法放在任何类中,当然如要访问assert等方法,你必须要引用junt.Assert类,如下:
| import
org.junt.Assert;
publc
class
AddtonTest
{
prvate
nt
x
=
1;
prvate
nt
y
=
1;
@Test
publc
vod
addton()
{
nt
z
=
x
+
y;
Assert.assertEquals(2,
z);
}
} |
你也可以使用JDK5中的新特性(statc
import)使得跟以前版本一样简单:
| import
statc
org.junt.Assert.assertEquals;
publc
class
AddtonTest
{
prvate
nt
x
=
1;
prvate
nt
y
=
1;
@Test
publc
vod
addton()
{
nt
z
=
x
+
y;
assertEquals(2,
z);
}
} |
这种方法测试受保护的方法非常容易,因为你可以在测试类中继承有受保护方法的类.
SetUp
和TearDown
JUnt
3
中
test
runners
会在每个测试之前自动调用
setUp()方法。此方法主要用于初始化变量,打开日志,重置环境变量等。下面是XOM's
XSLTransformTest中的
setUp()方法:
| protected
vod
setUp()
{
System.setErr(new
printStream(new
ByteArrayOutputStream()));
nputdir
=
new
file("data");
nputdir
=
new
file(nputdir,
"xslt");
nputdir
=
new
file(nputdir,
"nput");
} |
在JUnt
4中,你仍然可以在每个测试前初始化变量和配置环境,,然而,这些操作可以不用在Setup()中完成,你可以在初始化方法前面添加
@Beforer
来表示,如下:
| @Before
protected
vod
ntalze()
{
System.setErr(new
printStream(new
ByteArrayOutputStream()));
nputdir
=
new
file("data");
nputdir
=
new
file(nputdir,
"xslt");
nputdir
=
new
file(nputdir,
"nput");
} |
你也可以有多个方法标记有@Before,所有方法都会在每个测试之前执行:
| @Before
protected
vod
fndTestDatadirectory()
{
nputdir
=
new
file("data");
nputdir
=
new
file(nputdir,
"xslt");
nputdir
=
new
file(nputdir,
"nput");
}
@Before
protected
vod
redirectStderr()
{
System.setErr(new
printStream(new
ByteArrayOutputStream()));
} |
清除环境与JUNT3
差不多,在JUNT3中使用
tearDown()方法,下面的代码是结束测试时回收内存:
| protected
vod
tearDown()
{
doc
=
null;
System.gc();
} |
在JUnt
4中,你还可以使用
@After
标记来说明:
| @After
protected
vod
dsposeDocument()
{
doc
=
null;
System.gc();
} |
与
@Before一样,你也可以有多个标记有
@After的清除方法,每个都会在执行完每个测试后执行。
最后,你不需要在父类中明确调用这些初始化或清除方法.test
runner会自动调用这些标记的方法.子类中的@Before方法在父类的@Before方法之后执行(这与构造函数的执行顺序一样),而@After方法刚好相反,子类中的@After方法先执行.然而,多个@Before和@After方法的执行顺序就是未知的.
|
|
|
|
|
|
|
|
|
|
|