JUnit是为Java程序开发者实现单元测试的一个框架,它能使得Java单元测试更规范有效,并且更有利于测试的集成。
TestCase测试类
前面已经介绍了JUnit中部分断言实现,但是不能够把断言直接写到源代码中,最终运行发布的代码和测试应该是分离的两个部分,源程序是不应该知道有任何的单元测试的存在的。
JUnit框架中通过TestCase 实现单元测试,TestCase继承了Assert类,也就是说在TestCase类以及子类中可以直接使用JUnit框架所提供的断言。另外,TestCase实现了Test接口,Test接口的run方法将会运行一个测试,并返回结果。TestCase类的继承关系及方法的实现如图1所示:
图1 TestCase的类继承关系
如果需要使用JUnit做单元测试,可以继承TestCase,每一个TestCase的子类可以作为独立的测试用例,从而实现测试的目的。
TestSuite测试组
一个TestCase用例会包含多个test开头的测试函数,而一个应用中,会包括若干个TestCase的用例,通常用户会运行应用中的所有的测试,从而确保应用是可以运行的。有些测试是非常耗费时间,如果每次进行一个小的改动就运行所有的测试,这是很多开发人员不可接受的,这时就需要组合一些TestCase用例以及TestCase中的方法,把测试分成很多的组,每次只针对特定的组进行测试。
JUnit框架提供了TestSuite套件来组合测试类及测试方法,TestSuite实现了addTestSuite方法和addTest方法,addTestSuite和addTest能添加一个测试类或另一个TestSuite到当前组中,通过这种组合,用户能够把要测试的用例及方法分成一个组,最后组成一个测试的套件。
Setup与Tear-down
通常每个测试的运行都应该是独立的,从而就可以在任何时候,以任意的顺序运行每个单独的测试。然而有些时候需要一些全局的环境变量设置,每个测试用例都可以用到这些设置,而不必每个测试方法运行前都重新设置,这就需要在测试用例运行前使用不同的初始化方式。
测试用例的每一个方法的执行都是相互独立的,每个test方法执行之前,JUnit框架会执行相应的初始化方法,从而保证每个test方法的执行和其它test方法之间没有关系。当test方法执行后,JUnit框架也会自动执行清理方法。测试方法的初始化和清理工作是通过实现TestCase子类的setup和tearDown方法完成的。
要分清楚TestCase和TestSuite中方法的执行顺序,初始化条件,这对设计测试项目以及程序的设计都是非常重要的。