JUnit4百航信息baihang-china.com课程内容•JUnit简介•几个相关的概念•初识JUnit单元测试框架•单元测试工具•示例:在Eclipse中使用JUnit4进行单元测试•JUnit框架•JUnit几个核心类及接口•Assert超类所提供的8个核心方法•TestCase提供了10个自己的方法•JUnit4.X版本与以前版本的区别百航信息baihang-china.comJUnit简介•JUnit是由ErichGamma和KentBeck编写的一个测试框架。•开源软件•支持语言有Smalltalk,Java,C++,Perl等•支持的IDE:JBuilder,VisualAge,Eclipse等•JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。百航信息baihang-china.com几个相关的概念•白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。•回归测试——软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。•单元测试——是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。•JUnit——是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。百航信息baihang-china.com初识JUnit单元测试框架•单元级测试在面向对象的开发中变得越来越重要,而一个简明易学、适用广泛、高效稳定的单元级测试框架对成功的实施测试有着至关重要的作用。在java编程环境中,JunitFramework是一个已经被多数java程序员采用和实证的优秀的测试框架。开发人员只需要按照Junit的约定编写测试代码,就可以对自己要测试的代码进行测试。百航信息baihang-china.com单元测试工具•目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java)CppUnit(C)DUnit(Delphi)NUnit(.net)PhpUnit(Php)等等。百航信息baihang-china.com示例:在Eclipse中使用JUnit4进行单元测试百航信息baihang-china.com第一步:将JUnit4单元测试包引入项目在该项目上点右键,点“属性”选择“JavaBuildPath”,选择“Libraries”标签,点击“AddLibrary…”按钮百航信息baihang-china.com第二步,生成JUnit测试框架•在Eclipse的PackageExplorer中右点Calculate.java,选择new-“JUnitTestCase”百航信息baihang-china.com第二步,生成JUnit测试框架•在Eclipse的PackageExplorer中右点Calculate.java,选择new-“JUnitTestCase”百航信息baihang-china.comEclipse自动生成的框架百航信息baihang-china.com•org.junit.*;把junit包import进来之后,绝大部分功能就有了。•importstaticorg.junit.Assert.*;我们在测试的时候使用的一系列assertEquals等方法就来自这个包。注:assertEquals是Assert类中的一系列的静态方法,一般的使用方式是Assert.assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。(一)Import测试包百航信息baihang-china.com(二)测试类的声明•测试类是一个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。但是建议都用类名+Test来命名。•我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明百航信息baihang-china.com(三)创建一个待测试的对象•你要测试哪个类,那么你首先就要创建一个该类的对象。•为了测试Calculator类,我们必须创建一个calculator对象。百航信息baihang-china.com(四)测试方法的声明•在测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”来明确表明哪些是测试方法。@Before、@Test、@Ignore百航信息baihang-china.com(五)编写一个简单的测试方法•使用@Test标注,以表明这是一个测试方法。•方法名字可以随便取,没有任何限制,但是规范写法是test+方法名,方法名第一个子母大写。•方法的返回值必须为void,•方法不能有任何参数。•如果违反这些规定,运行时会抛出一个异常百航信息baihang-china.com•我们期待的结果应该是5。•assertEquals(5,calculator.getResult());就是来判断期待结果和实际结果是否相等•第一个参数填写期待结果,第二个参数填写实际结果。•JUnit会自动进行测试并把测试结果反馈给用户百航信息baihang-china.com(六)忽略测试某些尚未完成的方法•加上@Ignore标注的含义就是“某些方法尚未完成,暂不参与此次测试”。•这样的话测试结果就会提示你有几个测试被忽略,而不是失败百航信息baihang-china.com(七)Fixture“固定代码段”•@Before,@After是每个方法测试时候必然被调用的代码•保证每一个测试都是独立的,相互之间没有任何耦合度•这里不需要@Test标注,因为这不是一个test测试开始-setUp-testXXXX-tearDown-测试结束百航信息baihang-china.com@BeforeClass或@AfterClass•只在测试用例初始化时执行@BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作•用于测试读取文件等耗时的方法。•该方法必须是public和static的百航信息baihang-china.com(八)限时测试•对于那些逻辑很复杂,循环嵌套比较深的程序采用限时测试•函数设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时百航信息baihang-china.com(九)测试异常•expected属性用来测试函数应该抛出的异常百航信息baihang-china.com(十)Runner(运行器)•JUnit中有一个默认Runner,如果你没有指定,那么系统自动使用默认Runner来运行你的代码•@RunWith是用来修饰类,可以指定需要的Runner百航信息baihang-china.com(十一)参数化测试可以将所有参数集中起来一起测试,步骤如下:1:你要为这种测试专门生成一个新的类2:定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果3:定义测试数据的集合,用@Parameters标注进行修饰4:创建构造函数对先前定义的两个参数进行初始化百航信息baihang-china.com百航信息baihang-china.com(十二)打包测试步骤:1:用@RunWith标注传递一个参数Suite.class。2:用@Suite.SuiteClasses表明这个类是一个打包测试类。3:把需要打包的类作为参数传递给该标注百航信息baihang-china.com第三步:Eclipse中如何运行测试类•右击测试类-RunAs-JUnitTest百航信息baihang-china.com第四步:测试结果(1):运行CalculatorTest失败失败百航信息baihang-china.com第四步:测试结果(2):运行SquareTest百航信息baihang-china.com第四步:测试结果(3):运行AllCalculatorTests两个测试类百航信息baihang-china.comJUnit框架百航信息baihang-china.comJUnit几个核心类及接口Assert当条件成立时候assert方法保持沉默,但若条件不成立就抛出异常TestResult包含了测试中发生的所有错误或失败TestListener测试中若产生(开始,结束,错误,失败)会通知TestListenerTestCase定义了可以用于运行多项测试的环境(实现了Test接口)TestSuite运行一组testcase(他们可能包含其他testsuite),它是Test的组合(实现了TestSuite)BaseTestRunner用来启动测试的用户界面,BaseTestRunner是所有testrunner的超类百航信息baihang-china.comAssert超类所提供的8个核心方法assertEquals()用来查看对象中存的值是否是期待的值,与字符串比较中使用的equals()方法类似;assertFalse()assertTrue()用来查看变量是是否为false或true,如果assertFalse()查看的变量的值是false则测试成功,如果是true则失败,assertTrue()与之相反;assertSame()assertNotSame()用来比较两个对象的引用是否相等和不相等,类似于通过“==”和“!=”比较两个对象;assertNull()assertNotNull()用来查看对象是否为空和不为空;fail()让测试失败,并给出制定信息。百航信息baihang-china.comTestCase提供了10个自己的方法countTestcases计算run(TestResultresult)所执行的TestCase的数目(由Test接口规定)createResult创建默认的TestResult对象getName获得TestCase的名字run运行TestCase并收集TestResult中的结果runBare运行测试序列,但不执行任何特殊功能,比如自动发现test方法runTest重载以运行测试并断言其状态setName设置TestCase的名字setUp初始化fixturetearDown销毁fixturetoString()返回Test的字符信息百航信息baihang-china.comJUnit4.X版本与以前版本的区别1.测试类不必再从junit.framework.TestCase派生了;2.测试方法也不必再以“test”作为前缀,而是代之以@Test注解来表示;3.作为Fixtures的setUp与tearDown也不再强制使用这两个方法名了,只要在任何方法名称前冠以@Before或@After,即可达到一样的效果;4.对setUp/tearDown的一大改进还包括,可以限定二者只在整个testcase范围内执行一次,这是通过@BeforeClass和@AfterClass注解达成的;5.@Test注解还可以带上timeout参数和expected参数,前者代表测试方法超过指定时间即被认为失败,后者则声明了预期被抛出的异常类型。百航信息baihang-china.com