JUnit单元测试详解

一、JUnit(单元测试)是干什么的?
   JUnit是单元测试工具的意思, JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。   单元测试主要是来测试程序的结果和自己期望的值是否相等。

二、JUnit测试框架目前大体分为两个版本(JUnit 3.8 和 JUnit 4.x)


JUnit测试框架目前大体分为两种(JUnit 3.8 和 JUnit 4.x)

 

———————————— JUnit 3.8 ———————————————

涉及到的包一般是 import junit.framework.*

1.在 JUnit 3.8 中,如果要测试Person类,那么测试类的命名规则就是在这个类名后面加上 

Test, PersonTest.java, 测试类要继承TestCast类,而TestCast类又继承于Assert类 ,测试方法需满足如下原则:

1)修饰符设为 public

2)返回类型 void

3)没有方法参数

4)方法名称必须以test开头(它通过反射找出所有方法,然后找出以test开头的方法)。


2.不能依赖于测试方法的执行顺序

删除一些方法后不会对其他的方法产生任何的影响,我们不能依赖于测试方法的执行顺序。

Test Case之间一定要保持完全的独立性,不允许出现任何的依赖关系。


3.setUp方法和testDown方法都是TestCase类的方法

1)setUp方法是在执行每个测试方法之前执行的

2)testDown方法是在执行每个测试方法之后执行的

 

———————————— JUnit 4 ———————————————

涉及到的包是 import org.junit.*

1、在junit 4 当中测试类无需继承于 TestCase类,命名不再有JUnit3中的要求测试方法的名字也无需以test开头,主要以注解的方式来定义,只要在测试方法加上@Test就可以进行测试,但有些原则还是要以junit3 的风格来设计,比如测试方法以test开头,习惯问题吧。

2、JUnit4注解的应用

  • @Test :定义一个测试方法的标志
  • @Test(timeout=1000) :设置超时时间,如果测试时间超过了你定义的timeout,测试失败
  • @Test(expected) : 申明出会发生的异常,比如 @Test(expected = Exception.class)
  • @Ignore :让 测试方法 或 测试类 不被执行,让其失去测试的功能
  • @Before : 跟junit 3.8 上的setUp() 方法同样的效果,方法名最好和setUp()一样,但不强求,在每一个测试方法之前被执行
  • @After : 跟junit 3.8 上的tearDown() 方法同样的效果,方法名最好和tearDown()一样,但不强求,在每一个测试方法之后被执行
  • @BeforeClass : 被该注解申明的方法,功能是:在所有的测试方法之前执行,只执行一次
  • @AfterClass : 被该注解申明的方法,功能是:在所有的测试方法之后执行,只执行一次


三、JUnit4测试方法

        以前我们写好了一个类,类里有写好的方法,我想去测试,怎么测试?写个main方法,然后new这个类,然后去调用这个类里面的方法去测试,但是如果我们写了100个类,要写100个main方法去测试,完了之后,还要一个一个的删除,比较麻烦, JUnit就很好的解决了这样的问题。

1、举个例子新建一个项目,创建一个Person类,里面写两个测试方法
以前我们要测试Person中的方法的话,直接在Person类中写个mian方法然后去测试Person中的方法



2、现在我们用JUnit的话,有一个很大的好处就是测试代码和项目代码完全分离
新建一个Source Folder名字随便起,如test


3、在test中创建一个包,包的名字必须和src中的一样,也就是my.test
之所以要让包名一样是为了避免导包的麻烦,在工作空间项目bin文件下编译成的class文件是放在一起的。

          项目里源代码是分离的:
               
                   
          在我们的工作空间里编译后是在同一个文件里的,所以不需要导包:
                  


4、使用JUnit需要引用JUnit的类库

新建一个jUnit Test Case,这是一个测试用例
            

我们选择JUnit4,其中Name的命名可以不遵守JUnit3中的命名规则
            

5、运行测试方法有几种
      1.右键项目中测试方法直接Run As
         
        2.双击方法名,右键Run As

        出现绿条则说明测试成功,出现绿条则说明出现失败
          
          

以上看不出这有什么好处,但是当测试方法有多个的时候就看出来了,以前测试完了一个方法后,要将其注释,再测另一个方法,
现在的话想测试哪个方法就双击右键Run As运行哪个方法
四、JUnit注解

1、@Test:定义一个测试方法的标志
创建完后,测试Person类中的方法,在JUnit3中测试类需要继承 TestCase才能测试其中的方法,而在JUnit4中用的是注解,不需要继承TestCase。
     
2、 @Test(timeout=1000) :设置超时时间,如果测试时间超过了你定义的timeout,测试失败

    比如说我想测试一个算法,看看能不能在某个时间内完成
    例如,在方法上@Test(timeout=10)就是看此方法能不能再10毫秒内运行完毕
        
    如果不能再10毫秒内运行完毕则报错 test timed out after 10 millisenconds 
        
3、 @Test(expected):申明出会发生的异常 比如 @Test(expected =   Exception.class)
如:假设有些异常你在这不想处理,可以忽略掉

      如int a = 10/0会抛如下异常
            
           在@Test中加入expected=ArithmeticException.class上面抛出的异常,表示这个异常在这里
        不处理,可以忽略,运行后不报错

         
                

4、@Ignore :让测试方法或测试类不被执行,让其失去测试的功能
      如:假设有很多方法时,有些方法你不行测试而其他方 法你都要测试,
             则可通过注解来达到目的。
            在不用测试的方法上加上@Ignore表示此方法不参与测试
         如在testEat()方法上加上@Ignore注解,则在执行这个测试类的时候不会执行此方法
            
五、新建JUnit Test Case时下面的这几个方法的作用 

        
5、setUp()   tearDown() 的作用
   @Before : 跟setUp()方法同样的效果,在每一个测试方法之前被执行
   @After : 跟tearDown() 方法同样的效果,在每一个测试方法之后被执行

如:新建一个测试用例
                

               例如下图例子,执行测试类后输出
                
                这俩个方法用在什么地方呢?
            假设做一个输入输出流的话,比如做了一个文件的拷贝,现在要测试几个方法,
            每个方法都用到输入输出流,这样就可以把开启流写到方法setUp()中,关闭流
            写到tearDown()中,不需要在测试的方法中重复写了。

6. setUpbeforeClass() tearDownAfterClass() 的作用
  • @BeforeClass : 被该注解申明的方法功能是:在所有的测试方法之前执行,只执行一次
  • @AfterClass : 被该注解申明的方法功能是:在所有的测试方法之后执行,只执行一次

如:新建一个测试用例             
                    

              例如下图例子,执行测试类后输出
                  
                   setUpbeforeClass() tearDownAfterClass()静态方法是在类加载之前就执行了
                   从上可知  setUpBeforeClass()在所有测试方法之前只执行一次
                             tearDownAfterClass()在所有测试方法之后只执行一次


六、使用JUnit4测试私有方法
        
        当我们要测试的方法为私有的时候,不能直接对用,这个时候要用java的反射机制测试私有方法。

1、新建一个测试类PersonTestPrivate4


2、测试结果





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值