junit测试

来源:互联网 发布:objective c 知乎 编辑:程序博客网 时间:2024/06/15 07:09

JUnit测试

一、概要

    JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

    JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架。

    Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。

    Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

 

二、优点

 

    另外junit是在极限编程和重构(refactor)中被极力推荐使用的工具,因为在实现自动单元测试的情况下可以大大的提高开发的效率,但是实际上编写测试代码也是需要耗费很多的时间和精力的,那么使用这个东东好处到底在哪里呢?

    1)极限编程

    要求在编写代码之前先写测试,这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑,否则编写的代码很不稳定,那么你需要同时维护测试代码和实际代码,这个工作量就会大大增加。因此在极限编程中,基本过程是这样的:构思->编写测试代码-> 编写代码-> 测试,而且编写测试和编写代码都是增量式的,写一点测一点,在编写以后的代码中如果发现问题可以较快的追踪到问题的原因,减小回归错误的纠错难度。

    2)重构

    其好处和极限编程中是类似的,因为重构也是要求改一点测一点,减少回归错误造成的时间消耗。

    3)其他情况

    我们在开发的时候使用junit写一些适当的测试也是有必要的,因为一般我们也是需要编写测试的代码的,可能原来不是使用的junit,如果使用junit,而且针对接口(方法)编写测试代码会减少以后的维护工作,例如以后对方法内部的修改(这个就是相当于重构的工作了)。另外就是因为junit有断言功能,如果测试结果不通过会告诉我们哪个测试不通过,为什么,而如果是像以前的一般做法是写一些测试代码看其输出结果,然后再由自己来判断结果是否正确,使用junit的好处就是这个结果是否正确的判断是它来完成的,我们只需要看看它告诉我们结果是否正确就可以了,在一般情况下会大大提高效率。

 

三、特征

    JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:

    1)用于测试期望结果的断言(Assertion)

    2)用于共享共同测试数据的测试工具

    3)用于方便的组织和运行测试的测试套件

    4)图形和文本的测试运行器

 

四、安装:

    好多开发环境已经集成,直接使用就可以,或者引入jar包。

 

五、注解

       常用注解:

       @Before:初始化方法

       @After:释放资源

       @Test:测试方法,在这里可以测试期望异常和超时时间

       @Ignore:忽略的测试方法

       @BeforeClass:针对所有测试,只执行一次,且必须为static void

       @AfterClass:针对所有测试,只执行一次,且必须为static void

    

     一个JUnit 4 的单元测试用例执行顺序为:

       @BeforeClass–> @Before –> @Test –>@After –> @AfterClass

       每一个测试方法的调用顺序为:

       @Before–> @Test –> @After

 

 

1.@Before:

         表示该方法在每个测试方法执行前执行一次,可用于一些初始工作。

 

2.@BeforeClass:

         该方法在所有测试方法运行前运行,且只运行一次,添加该注释的方法必须修饰为 public static void 且没有参数。

 

3.@Test : 表示测试方法。

        注意:   

        1.测试方法必须使用注解 org.junit.Test 修饰。

        2.测试方法必须使用 public void 修饰,而且不能带有任何参数。

         该方法有两个属性:

       a:expected :该属性表示测试方法必须抛出一个异常,且异常的类型必须是该属性要求的类型,否则表示测试方法失败。也叫做异常测试。

       例如:@Test(expected=IndexOutOfBoundsException.class)

      b:timeout 用于超时测试,表示该测试方法的执行时间如果超过了要求的时间则失败单位为毫秒

       例如:@Test(timeout=100)

 

 

 

4.@Ignore :

         表示会被忽略的测试方法

 

5.@After :

         被注释的方法会在每个测试方法执行完成之后执行一次,如果其它的方法抛出了异常,该方法同样会被执行。主要用于释放在@Before方法中初始化的资源。

 

6.@AfterClass:

         功能同@After ,只不过是该方法释放的是@BeforeClass方法初始化的资源。且在所有的测试方法执行完成之后,只执行一次。

 

7.@Runwith:

         测试运行器,放在测试类名之前,用来确定测试类怎么运行的,当不指定这个注解时,使用默认Runner来运行测试代码,即@RunWith(JUnit4.class)。常见的运行器有:

       (1)@RunWith(Parameterized.class):参数化运行器,配合@Parameters使用JUnit的参数化功能。

       (2)@RunWith(Suite.class)

        @SuiteClasses({ATest.class,BTest.class,CTest.class})

         测试集运行器配合使用测试集功能。  

       (3)@RunWith(JUnit4.class):JUnit 4的默认运行器

       (4)@RunWith(JUnit38ClassRunner.class):用于兼容junit3.8的运行器

 

8.@Parameters:

       用于JUnit的参数化功能,用来标记准备数据的方法。

     

六、断言

JUnit为我们提供了一些辅助函数,他们用来帮助我们确定被测试的方法是否按照预期的效果正常工作,通常,把这些辅助函数称为断言。

函数原型1:

    assertEquals([String message],expected,actual)

参数说明:

    message:可选的消息,假如提供,将会在发生错误时报告这个消息。

    expected:是期望值,通常都是用户指定的内容。

    actual:是被测试的代码返回的实际值。

    例:assertEquals("equals","1","1"); 

函数原型2:

    assertEquals([Stringmessage],expected,actual,tolerance)

参数说明:

    message:可选的消息,假如提供,将会在发生错误时报告这个消息。

    expected:期望值,通常都是用户指定的内容。

    actual:被测试的代码返回的实际值。

    tolerance:误差参数,参加比较的两个浮点数在这个误差之内则会被认为是相等的。

    例:assertEquals ("yes",5.8,11.0/2.0,0.5);

 

2 assertTrue

函数原型:

    assertTrue([String message],Boolean condition)

参数说明: 

    message:可选的消息,假如提供,将会在发生错误时报告这个消息
  condition:待验证的布尔型值。

说明:

    该断言用来验证给定的布尔型值是否为真,假如结果为假,则验证失败。当然,更有验证为假的测试条件。

   

函数原型:

    assertFalse([Stringmessage],Boolean condition)

说明:

    该断言用来验证给定的布尔型值是否为假,假如结果为真,则验证失败。

例:assertTrue("true",1==1);

    assertFalse("false",2==1);

 

3 assertNull

函数原型:

    assertNull([Stringmessage],Object object)

参数说明:

    message:可选的消息,假如提供,将会在发生错误时报告这个消息。

    object:待验证的对象。

说明:

    该断言用来验证给定的对象是否为null,假如不为null,则验证失败。相应地,还存在能够验证非null的断言:

 

函数原型:

    assertNotNull([Stringmessage],Object object)

说明:

    该断言用来验证给定的对象是否为非null,假如为null,则验证失败。

 

例:assertNull("null",null);

    assertNotNull("not null",newString());

 

4 assertSame

函数原型:

    assertSame([String message], expected,actual)

参数说明:

    message:可选的消息,假如提供,将会在发生错误时报告这个消息。

    expected:期望值。

    actual:被测试的代码返回的实际值。

说明:

    该断言用来验证expected参数和actual参数所引用的是否是同一个对象,假如不是,则验证失败。相应地,也存在验证不是同一个对象的断言:

 

函数原型:

    assertNotSame([String message], expected,actual)

说明:

    该断言用来验证expected参数和actual参数所引用的是否是不同对象,假如所引用的对象相同,则验证失败。

例:assertSame("same",2,4-2);

    assertNotSame("not same",2,4-3);

 

5 Fail

函数原型:

    Fail([Stringmessage])

参数说明:

    message是个可选的消息,假如提供,将会在发生错误时报告这个消息。

该断言会使测试立即失败,通常用在测试不能达到的分支上(如异常)。 

 

七、打包测试

方式一:注意测试类必须继承TestCase

import junit.framework.TestSuite; 
import junit.framework.Test; 
import junit.textui.TestRunner; 

/** 
*
测试单元 
* File: TestAll.java 
* User: leizhimin 
* Date: 2008-3-13 16:17:10 
*/
 
public class TestAll extends TestSuite{ 
    public static Test suite() { 
        TestSuite suite = new TestSuite("TestSuiteTest"); 
        suite.addTestSuite(TestCalcuator.class); 
        suite.addTestSuite(TestCalcuator2.class); 
        return suite; 
    } 
    public static void main(String args[]){ 
        TestRunner.run(suite()); 
    } 
}

 

方式二:

同样,如果一个项目中有很多个测试用例,如果一个个测试也很麻烦,因此打包测试就是一次性测试完成包中含有的所有测试用例。

[java] view plaincopy

1. package test;  

2.   

3. import org.junit.runner.RunWith;  

4. import org.junit.runners.Suite;  

5.   

6. @RunWith(Suite.class)  

7. @Suite.SuiteClasses({ AssertTests.class, FibonacciTest.class, JDemoTest.class })  

8. public class AllCaseTest {  

9.   

10.}  

这个功能也需要使用一个特殊的Runner ,需要向@RunWith注解传递一个参数Suite.class。同时,我们还需要另外一个注解@Suite.SuiteClasses,来表明这个类是一个打包测试类。并将需要打包的类作为参数传递给该注解就可以了。至于AllCaseTest随便起一个类名,内容为空既可。运行AllCaseTest类即可完成打包测试。

方式三:

      /**

       * @function suite

       * @return TestSuite

       * @description创建测试套件

       */

      public static TestSuite suite() {

            TestSuite tSuite = new TestSuite();

            tSuite.addTest(new TestEnvironment("testAdd"));

            tSuite.addTest(new TestEnvironment("testDivision"));

            tSuite.addTest(new TestEnvironment("testSingleton"));

            tSuite.addTest(new TestEnvironment("testPrototype"));

            tSuite.addTest(new TestEnvironment("testObserver"));

            tSuite.addTest(new TestEnvironment("testBuilder"));

            tSuite.addTest(new TestEnvironment("testAdapter"));

            tSuite.addTest(new TestEnvironment("testProxy"));

            tSuite.addTest(new TestEnvironment("testComposite"));

            return tSuite;

      }

     

      /**

       * @function main

       * @param args

       * @return void

       * @description测试环境的入口

       */

      public static void main(String[] args) {

            junit.textui.TestRunner.run(suite());//运行测试

      }

1 0
原创粉丝点击