JBuilder 2005单位测试之JUnit框架
副标题#e#
简朴的框架
JUnit是由Erich Gamma和Kent Beck开拓的开源测试框架,JBuilder集成了这个框架并对此做了扩展。JUnit之所以风行并为宽大的开拓人员所推崇,一是因为它实战性强,成果强大,二是因为它实在简朴。一个产物或框架要能有生命力,最好都具备这样的特点。
简朴地讲这个框架提供了很多断言(assert)要领,答允你配置测试的法则,如:assertEquals()、assertNull()、assertNotSame()、assertTrue()等要领,一个测试用例包罗了多个断言,当运行测试用例后,JUnit运行器会陈诉哪些断言没有通过,开拓人员就可顺藤摸瓜搞个水落石出了。而传统的测试要领需要将期望的功效用诸如System.out.println()等语句将进程信息打印到节制台或日志中,由开拓人员调查输出信息以判定是否正确,此刻这种"调查"的事情由JUnit的那些assertXxx()要领自动完成。
JUnit的测试框架类布局很简朴,主要由3个类构成,其类图干系如下图所示:
图 错误!文档中没有指定样式的文字。JUnit测试框架类布局
·junit.framework.Test:测试接口。
·junit.framework.TestCase:测试用例类,业务类的测试用例类只需要承继这个TestCase,按照环境编写若干个public void testXxx()要领,在要领中通过assertYyy()定制若干测试法则就可以了。
·junit.framework.TestSuite:测试套件类,它可以将多个测试用例类绑缚在一起运行,也可以绑缚另一个测试套件。
测试固件(Fixture)
一个测试用例可以包括若干个testXxx()测试要领,测试用例测试一个或多个类API接口的正确性,虽然在挪用类API时,需要事先建设这个类的工具及一些关联的工具,这组工具就称为测试固件(Fixture),相当于测试用例的"事情工具"。
我们在前面说过,一个测试用例类可以包括多个testXxx()要领,在运行时,每个测试要领都对应一个测试用例类的实例。虽然,你可以在详细的testXxx()要领里声明并实例化业务类的实例,在测试完成后再销毁它们。可是,这么一来你就要在每个testXxx()要领中都反复这些代码,因为TestCase实例被运行时,依照以下步调运行:
1.建设测试用例的实例。
2.挪用setUp()要领,执行一些初始化事情。
3.运行testXxx()测试要领。
4.挪用tearDown()要领,执行销毁工具的事情。
假如测试用例类中有多个testXxx()要领,且它们都需要利用到沟通的一组工具,我们可以在setUp()中实例化这组工具,并在tearDown()中销毁它们。要编写测试固件,依照以下步调举办:
1.建设TestCase类的子类。
2.在子类中声明若干个测试所用的工具。
3.包围setUp()要领,在要领中实例化这些工具。
4.包围tearDown()要领,释放这些工具的资源。
如下面等于一个简朴的测试固件:
代码清单 错误!文档中没有指定样式的文字。测试固件
1. public class MoneyTest extends TestCase
2. {
3. private Money f12CHF;//12瑞士法郎
4. private Money f14CHF; //14瑞士法郎
5. private Money f28USD; //28美国美元
6. protected void setUp() {
7. f12CHF= new Money(12, "CHF");
8. f14CHF= new Money(14, "CHF");
9. f28USD= new Money(28, "USD");
10. }
11. protected void tearDown(){}
12. }
第3~5行声明白3个Money类工具(测试固件),在setUp()要领中实例化这3个工具(第7~9行),由于这些工具可以被垃圾举办直接接纳,所以在tearDown()中不做任何操纵。
#p#副标题#e#
测试用例(TestCase)
有了测试固件,就可以开始编写测试用例的测试要领了。虽然你也可不需要测试固件而直接编写测试用例要领。下面我们在测试固件的基本上添加测试用例要领testMoneyBag(),代码如下所示:
代码清单 错误!文档中没有指定样式的文字。测试用例要领
1. public class MoneyTest extends TestCase
2. {
3. private Money f12CHF;//12瑞士法郎
4. private Money f14CHF; //14瑞士法郎
5. private Money f28USD; //28美国美元
6. protected void setUp() {
7. f12CHF= new Money(12, "CHF");
8. f14CHF= new Money(14, "CHF");
9. f28USD= new Money(28, "USD");
10. }
11. public void testMoneyBag()
12. {
13. Money bag[]= { f26CHF, f28USD };
14. MoneyBag expected= new MoneyBag(bag);
15. assertEquals(expected, f12CHF.add(f28USD.add(f14CHF)));
16. }
17. protected void tearDown(){}
18. }
#p#分页标题#e#
测试要领都必需以test为前缀,且必需是public void的,运行器以此为反射查找法则找到这些测试用例要领。在一个要领中可以包罗多个assertYyy()要领,每个assertYyy()要领都是一个测试法则。像第15行的assertYyy()断言要领即为测试Money的add()要领和MoneyBag类正确性的测试法则。
你可以在MoneyTest中添加多个public void testXxx()要领,运行器为每个要领生成一个测试用例实例,别离运行。
测试套件(TestSuite)
假如每次只能运行一个测试用例,那么又陷入了我们前面所谈到的传统测试的困境:手工去运行一个个测试用例,测试套件专门为办理这一问题而来。它通过TestSuite工具将多个测试用例组装成到一个测试套件,则测试套件批量运行。需要非凡指出的是,可以把一个测试套件整个添加到另一个测试套件中,就象小筐装进大筐里酿成一个箧一样。
测试套件类也通过承继TestCase类实现,只不外它提供了一个public static Test suite()静态要领,在该要领中将多个测试用例绑缚组装在一起。一个典范的测试套件代码如下所示:
代码清单 错误!文档中没有指定样式的文字。测试套件
1. public class MoneyTestSuite extends TestCase
2. {
3. public TestSuite1(String s)
4. {
5. super(s);
6. }
7. public static Test suite()
8. {
9. TestSuite suite = new TestSuite();
10. suite.addTestSuite(MoneyTest.class);
11. suite.addTestSuite(MoneyBag.class);
12. return suite;
13. }
14. }
在第9行中声明并实例化了一个TestSuite,在第10、11行别离插手一个测试用例。你可以通过suite.addTest(Test t)要领添加一个套件。这样运行这个套件就可以自动运行所有测试用例的测试要领了。
测试运行器
JUnit提供了3个尺度的测试运行器运行这些测试用例或测试套件,这3个测试运行器别离是:
·junit.textui.TestRunner:文本测试运行器。
·junit.awtui.TestRunner:利用AWT组件界面的测试运行器。
·junit.swingui.TestRunner:利用Swing组件界面的测试运行器。
下面是基于AWT组件的测试运行器,如下图所示:
图 错误!文档中没有指定样式的文字。AWT测试运行器
·Test class name:指定测试用例类和测试套件类。
·一个进度条:暗示运行测试的执行进度,进度条下是正确、错误、失败的测试统计数。
·Error and Failures:列出了测试错误和失败的列表,点选个中的一个选项时,JUnit在窗口底部列堕落误跟踪迹。
提示:
JBuilder提供了利便的运行测试用例和测试套件类的要领,你只须点击鼠标右键就可直接挪用了。另外,JBuilder提供了一个JBTestRunner测试运行器,在成果和易用性上非JUnit提供的测试运行器所能媲美。JBuilder支持JUnit所提供的两个测试运行器:junit.textui.TestRunner和junit.swingui.TestRunner。