词条 | 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。