Junit使用简明手册.doc
《Junit使用简明手册.doc》由会员分享,可在线阅读,更多相关《Junit使用简明手册.doc(25页珍藏版)》请在三一办公上搜索。
1、JUnit是什么?JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:1、用于测试期望结果的断言(Assertion)2、用于共享共同测试数据的测试工具3、用于方便的组织和运行测试的测试套件4、图形和文本的测试运行器JUnit最初是由Erich Gamma(GoF之一)和Kent Beck(xp和refactor的先驱之一)编写的.需要说明的是junit一般是用来进行单元测试的,因此需要了解被测试代码的内部结构(即所谓的白盒测试),另外junit是在xp编程和重构 (refactor)中被极
2、力推荐使用的工具,因为在实现自动单元测试的情况下可以大大的提高开发的效率,但是实际上编写测试代码也是需要耗费很多的时间 和精力的,那么使用这个东东好处到底在哪里呢?笔者认为是这样的:1、对于xp编程而言,要求在编写代码之前先写测试,这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑,否则编写的代码很不稳定,那么你需 要同时维护测试代码和实际代码,这个工作量就会大大增加。因此在xp编程中,基本过程是这样的:构思编写测试代码编写代码测试,而且编写测试 和编写代码都是增量式的,写一点测一点,在编写以后的代码中如果发现问题可以较块的追踪到问题的原因,减小回归错误的纠错难度2、对于重构而言,其
3、好处和xp编程中是类似的,因为重构也是要求改一点测一点,减少回归错误造成的时间消耗。3、对于非以上两种情况,我们在开发的时候使用junit写一些适当的测试也是有必要的,因为一般我们也是需要编写测试的代码的,可能原来不是使用的 junit,如果使用junit,而且针对接口(方法)编写测试代码会减少以后的维护工作,例如以后对方法内部的修改(这个就是相当于重构的工作了)。另 外就是因为junit有断言功能,如果测试结果不通过会告诉我们那个测试不通过,为什么,而如果是想以前的一般做法是写一些测试代码看其输出结果,然后再 由自己来判断结果使用正确,使用junit的好处就是这个结果是否正确的判断是它来完成
4、的,我们只需要看看它告诉我们结果是否正确就可以了,在一般情况下 会大大提高效率。JUnit入门cherami 整理安装JUnit安装很简单,先到以下地址下载一个最新的zip包:下载完以后解压缩到你喜欢的目录下,假设是JUNIT_HOME,然后将JUNIT_HOME下的junit.jar包加到你的系统的CLASSPATH 环境变量中,对于IDE环境,对于需要用到的junit的项目增加到lib中,其设置不同的IDE有不同的设置,这里不多讲。如何使用JUnit写测试?最简单的范例如下:1、创建一个TestCase的子类:package junitfaq;import java.util.*;impo
5、rt junit.framework.*;public class SimpleTest extends TestCase public SimpleTest(String name) super(name);2、写一个测试方法断言期望的结果:public void testEmptyCollection() Collection collection = new ArrayList();assertTrue(collection.isEmpty();注意:JUnit推荐的做法是以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试。3、写一个suite()方法,它会使用反射动态
6、的创建一个包含所有的testXxxx方法的测试套件:public static Test suite() return new TestSuite(SimpleTest.class);4、写一个main()方法以文本运行器的方式方便的运行测试:public static void main(String args) junit.textui.TestRunner.run(suite();5、运行测试:以文本方式运行:java junitfaq.SimpleTest通过的测试结果是:.Time: 0OK (1 tests)Time上的小点表示测试个数,如果测试通过则显示OK。否则在小点的后边标上
7、F,表示该测试失败。每次的测试结果都应该是OK的,这样才能说明测试是成功的,如果不成功就要马上根据提示信息进行修正了。如果JUnit报告了测试没有成功,它会区分失败(failures)和错误(errors)。失败是你的代码中的assert方法失败引起的;而错误则 是代码异常引起的,例如ArrayIndexOutOfBoundsException。以图形方式运行:java junit.swingui.TestRunner junitfaq.SimpleTest通过的测试结果在图形界面的绿色条部分。以上是最简单的测试样例,在实际的测试中我们测试某个类的功能是常常需要执行一些共同的操作,完成以后需要
8、销毁所占用的资源(例如网络连接、数据库连接, 关闭打开的文件等),TestCase类给我们提供了setUp方法和tearDown方法,setUp方法的内容在测试你编写的TestCase子类的 每个testXxxx方法之前都会运行,而tearDown方法的内容在每个testXxxx方法结束以后都会执行。这个既共享了初始化代码,又消除了各 个测试代码之间可能产生的相互影响。JUnit最佳实践Martin Fowler说过:“当你试图打印输出一些信息或调试一个表达式时,写一些测试代码来替代那些传统的方法。”一开始,你会发现你总是要创建一些新的 Fixture,而且测试似乎使你的编程速度慢了下来。然而
9、不久之后,你会发现你重复使用相同的Fixture,而且新的测试通常只涉及添加一个新的测试 方法。你可能会写许多测试代码,但你很快就会发现你设想出的测试只有一小部分是真正有用的。你所需要的测试是那些会失败的测试,即那些你认为不会失败的测试,或你认为应该失败却成功的测试。我 们前面提到过测试是一个不会中断的过程。一旦你有了一个测试,你就要一直确保其正常工作,以检验你所加入的新的工作代码。不要每隔几天或最后才运行测试, 每天你都应该运行一下测试代码。这种投资很小,但可以确保你得到可以信赖的工作代码。你的返工率降低了,你会有更多的时间编写工作代码。不要认为压力大,就不写测试代码。相反编写测试代码会使你
10、的压力逐渐减轻,应为通过编写测试代码,你对类的行为有了确切的认识。你会更快地编写出有效率地工作代码。下面是一些具体的编写测试代码的技巧或较好的实践方法:1. 不要用TestCase的构造函数初始化Fixture,而要用setUp()和tearDown()方法。2. 不要依赖或假定测试运行的顺序,因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。3. 避免编写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的会滚就可以了。4. 当继承一个测试类时,记得调用父类的setUp()和tearDown(
11、)方法。5. 将测试代码和工作代码放在一起,一边同步编译和更新。(使用Ant中有支持junit的task.)6. 测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。7. 确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。8. 如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。9. 尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。10.测试要尽可能地小,执行速度快。Junit使用简明手册在使用XP进行开发的过程,unit test是必不
12、可少的环节。作为unit test,junit是首选的工具。本文从使用目的、如何使用、以及使用中需要考虑的问题,简略描述了junit的基本用法。使用目的junit是java中书写unit test的framework,目前一些流行的unit test工具大都都是在junit上扩展而来的。目前它的版本是junit3.8.1,可以从www.junit.org上下载。用法1. 基本使用步骤,Junit的使用非常简单,它的基本使用步骤:- 创建,从junit.framework.TestCase派生unit test需要的test case- 书写测试方法,提供类似于如下函数签名的测试方法:publi
13、c void testXXXXX();- 编译,书写完test case后,编译所写的test case类- 运行,启动junit test runner,来运行这个test case。Junit提供了2个基本的test runner:字符界面和图形界面。启动命令分别如下:a 图形界面:java junit.swingui.TestRunner XXXXXb 字符界面:java junit.textui.TestRunner XXXXX2. 使用例子:import junit.frmework.TestCase;public class TestSample extends TestCaset
14、public void testMethod1()assertTrue( true);3. setUp与tearDown,这两个函数是junit framework中提供初始化和反初始化每个测试方法的。setUp在每个测试方法调用前被调用,负责初始化测试方法所需要的测试环境;tearDown在每个测试方法被调用之后被调用,负责撤销测试环境。它们与测试方法的关系可以描述如下: 测试开始 - setUp - testXXXX - tearDown -测试结束4. 使用例子:import junit.frmework.TestCase;public class TestSample extends
15、TestCasetprotected void setUp()/初始化public void testMethod1()assertTrue( true);potected void tearDown()/撤销初始化5. 区分fail、exception。- fail,期望出现的错误。产生原因:assert函数出错(如assertFalse(true));fail函数产生(如fail())。- exception,不期望出现的错误,属于unit test程序运行时抛出的异常。它和普通代码运行过程中抛出的runtime异常属于一种类型。对于assert、fail等函数请参见junit的javad
16、oc。6. 使用例子:import junit.frmework.TestCase;public class TestSample extends TestCasetprotected void setUp()/初始化public void testMethod1()tryboolean b= assertTrue( b);throw new Exception( “This is a test.”);fail( “Unable point.”);/不可能到达catch(Exception e)fail( “Yes, I catch u”); /应该到达点potected void tearD
17、own()/撤销初始化7. 组装TestSuite,运行更多的test。在junit中,Test、TestCase和TestSuite三者组成了composiste pattern。通过组装自己的TestSuite,可以完成对添加到这个TestSuite中的所有的TestCase的调用。而且这些定义的TestSuite还可以组装成更大的TestSuite,这样同时也方便了对于不断增加的TestCase的管理和维护。它的另一个好处就是,可以从这个TestCase树的任意一个节点(TestSuite或TestCase)开始调用,来完成这个节点以下的所有TestCase的调用。提高了unit tes
18、t的灵活性。8. 使用例子:import junit.framework.Test;import junit.framework.TestSuite;public class TestAllpublic class TestAll/定义一个suite,对于junit的作用可以视为类似于java应用程序的main。 public static Test suite() TestSuite suite = new TestSuite(Running all tests.); suite.addTestSuite( TestCase1.class); suite.addTestSuite( Test
19、Case2.class); return suite; 运行同运行单独的一个TestCase是一样的,参见step 1 “运行”。9. 使用Ant junit task。我们除了使用java来直接运行junit之外,我们还可以使用junit提供的junit task与ant结合来运行。涉及的几个主要的ant task如下:- ,定义一个junit task- ,位于中,运行多个TestCase- ,位于中,运行单个TestCase- ,位于中,定义一个测试结果输出格式- ,定义一个junitreport task- ,位于中,输出一个junit report具体的语法请参见相关文档。10. 使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Junit 使用 简明 手册
链接地址:https://www.31ppt.com/p-2884563.html