请输入您要查询的百科知识:

 

词条 junit
释义

§ 基本简介

junitjunitJUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:

1、用于测试期望结果的断言(Assertion);

2、用于共享共同测试数据的测试工具;

3、用于方便的组织和运行测试的测试套件;

4、图形和文本的测试运行器。

测试流程:

1、扩展TestCase类;

2、覆盖runTest()方法(可选);

3、对应测试目标类书写testXXXXX()方法;

4、扩展TestSuite类,重载suite()方法,实现自定义的测试过程;

5、运行TestRunner进行测试;

§ 功能作用

junitjunit是在xp编程和重构(refactor)中被极力推荐使用的工具,因为在实现自动单元测试的情况下可以大大的提高开发的效率,但是实际上编写测试代码也是需要耗费很多的时间和精力的:

1、对于xp编程而言,要求在编写代码之前先写测试,这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑,否则编写的代码很不稳定,那么你需要同时维护测试代码和实际代码,这个工作量就会大大增加。因此在xp编程中,基本过程是这样的:构思-》编写测试代码-》编写代码-》测试,而且编写测试和编写代码都是增量式的,写一点测一点,在编写以后的代码中如果发现问题可以较块的追踪到问题的原因,减小回归错误的纠错难度。

2、对于重构而言,其好处和xp编程中是类似的,因为重构也是要求改一点测一点,减少回归错误造成的时间消耗。

3、对于非以上两种情况,在开发的时候使用junit写一些适当的测试也是有必要的,因为一般也是需要编写测试的代码的,可能原来不是使用的junit,如果使用junit,而且针对接口(方法)编写测试代码会减少以后的维护工作,例如以后对方法内部的修改(这个就是相当于重构的工作了)。另外就是因为junit有断言功能,如果测试结果不通过会那个测试不通过,为什么,而如果是想以前的一般做法是写一些测试代码看其输出结果,然后再由自己来判断结果使用正确,使用junit的好处就是这个结果是否正确的判断是它来完成的,只需要看看它告诉结果是否正确就可以了,在一般情况下会大大提高效率。

§ 框架介绍

junit一、TestCase

测试用例,对每个测试类,都要定义一个测试用例。JUnit支持两种运行单个测试的方法:静态的和动态的方法。

1、静态的方法就是覆盖TestCase类的runTest()方法,一般是采用内部类的方式

创建一个测试实例:

TestCase test01 = new testCar("test getWheels") {

public void runTest() {

testGetWheels();

}

}

采用静态的方法要注意要给每个测试一个名字,这样你就可以区分哪个测试失败了。

2、动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名字就是需要调用的测试方法的名字: TestCase test01 = new testCar("testGetWheels");

JUnit会动态查找并调用指定的测试方法。动态的方法很简洁,但如果你键入了错误的名字就会得到一个令人奇怪的NoSuchMethodException异常。动态的方法和静态的方法都很好,你可以按照自己的喜好来选择。

二、TestSuite

一旦你创建了一些测试实例,下一步就是要让他们能一起运行。必须定义一个TestSuite。在JUnit中,这就要求你在TestCase类中定义一个静态的suite()方法。suite()方法就像main()方法一样,JUnit用它来执行测试。在suite()方法中,你将测试实例加到一个TestSuite对象中,并返回这个TestSuite对象。一个TestSuite对象可以运行一组测试。TestSuite和TestCase都实现了Test接口,而Test接口定义了运行测试所需的方法。这就允许你用TestCase和TestSuite的组合创建一个TestSuite。

public static Test suite() {

TestSuite suite= new TestSuite();

suite.addTest(new testCar("testGetWheels"));

suite.addTest(new testCar("testGetSeats"));

return suite;

}

public static Test suite() {

return new TestSuite(testCar.class);

}

junit三、TestRunner

有了TestSuite就可以运行这些测试了,JUnit提供了三种界面来运行测试

[Text UI] junit.textui.TestRunner

[AWT UI] junit.awtui.TestRunner

[Swing UI] junit.swingui.TestRunner

java junit.textui.TestRunner yourTestclass

Fixture

如果需要在一个或若干个的类执行多个测试,这些类就成为了测试的context。在JUnit中被称为Fixture。当你编写测试代码时,你会发现你花费了很多时间配置/初始化相关测试的Fixture。将配置Fixture的代码放入测试类的构造方法中并不可取,因为要求执行多个测试,我并不希望某个测试的结果意外地影响其他测试的结果。通常若干个测试会使用相同的Fixture,而每个测试又各有自己需要改变的地方。

为此,JUnit提供了两个方法,定义在Test Case类中。

protected void setUp() throws java.lang.Exception protected void tearDown() throws java.lang.Exception 覆盖setUp()方法,初始化所有测试的Fixture,如建立数据库连接,将每个测试略有不同的地方在testXXX()方法中进行配置。覆盖tearDown(),释放你在setUp()中分配的永久性资源,如数据库连接。 当JUnit执行测试时,它在执行每个testXXXXX()方法前都调用setUp(),而在执行每个testXXXXX()方法后都调用tearDown()方法,由此保证了测试不会相互影响。

四、Assert

Assert类中定义了相当多的assert方法,主要有assert(),assertEquals(), assertNull(), assertSame(), assertTrue(), fail()等方法。Faile失败是一个期望的被assert方法检查到的结果。Error错误则是意外的问题引起的,如ArrayIndexOutOfBoundsException。

§ 实践方法

junit1、不要用TestCase的构造函数初始化Fixture,而要用setUp()和tearDown()方法。

2、不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。

3、避免编写有副作用的Test Case。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的会滚就可以了。

4、当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。

5、将测试代码和工作代码放在一起,一边同步编译和更新。(使用Ant中有支持junit的task.)

6、测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。

7、确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。

8、如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。

9、尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。

10、测试要尽可能地小,执行速度快。

§ 和ant结合

junitant提供了两个target:junit和junitreport运行所有测试用例,并生成html格式的报表。

具体操作如下:

1、将junit.jar放在ANT_HOMElib目录下

2、修改build.xml,加入如下内容:

--------------One or more tests failed,check the report for detail---------------

运行这个target,ant会运行每个TestCase,在report目录下就有了很多TEST*.xml和一些网页打开report目录下的index.html就可以看到很直观的测试运行报告,一目了然。在Eclipse中开发、运行JUnit测试相当简单。因为Eclipse本身集成了JUnit相关组件,并对JUnit的运行提成了无缝的支持。

随便看

 

百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/11 14:22:35