zoukankan      html  css  js  c++  java
  • 使用Junit4进行单元测试

      Unit 是 Java 社区中知名度最高的单元测试工具。它诞生于 1997 年,由 Erich Gamma 和 Kent Beck 共同开发完成。其中 Erich Gamma 是经典著作《设计模式:可复用面向对象软件的基础》一书的作者之一,并在 Eclipse 中有很大的贡献;Kent Beck 则是一位极限编程(XP)方面的专家和先驱。

      麻雀虽小,五脏俱全。JUnit 设计的非常小巧,但是功能却非常强大。Martin Fowler 如此评价 JUnit:在软件开发领域,从来就没有如此少的代码起到了如此重要的作用。它大大简化了开发人员执行单元测试的难度,特别是 JUnit 4 使用 Java 5 中的注解(annotation)使测试变得更加简单。

    JUnit 4 初体验

    在开始体验 JUnit 4 之前,我们需要以下软件的支持:

    • Eclipse:最为流行的 IDE,它全面集成了 JUnit,并从版本 3.2 开始支持 JUnit 4。当然 JUnit 并不依赖于任何 IDE。您可以从http://www.eclipse.org/ 上下载最新的 Eclipse 版本。
    • Ant:基于 Java 的开源构建工具,您可以在 http://ant.apache.org/ 上得到最新的版本和丰富的文档。Eclipse 中已经集成了 Ant,但是在撰写本文时,Eclipse 使用的 Ant 版本较低(必需 1.7 或者以上版本),不能很好的支持 JUnit 4。
    • JUnit:它的官方网站是 http://www.junit.org/。您可以从上面获取关于 JUnit 的最新消息。如果您和本文一样在 Eclipse 中使用 JUnit,就不必再下载了。
    1. 首先,建立一个项目CalculatorTest,编写一个Calculator的类,实现最基本的对int型的加减乘除四则运算。该类代码(github地址:https://github.com/shuaiyue/CalculatorTest)如下:
      public class Calculator {
          
          public int add(int a, int b) {
              return a + b;
          }
          
          public int substract(int a, int b) {
              return a - b;
          }
          
          public int multiply(int a, int b) {
              return a * b;
          }
          
          public int divide(int a, int b) throws Exception {
              if(0 == b) {
                  throw new Exception("除数不能为0");
              } else {
                  return a / b; 
              }
          }
      }
    2. 将Junit单元测试包引入项目,操作:在该项目上点击右键→"Properties",如图:在弹出的窗口中,先选择左边栏的“Java Build Path”,在右边选择“Libraries”标签,点击“Add Libraries”,点击“JUnit”引入JUnit4单元测试包。
    3. 生成JUnit测试框架:右击需要测试的类Calculator.java,选择“New”→“Junit Test Case”,如图:点击“Next”,在列出的待测类里选择需要测试的类,如图:之后,在生成的CalculatorTest新类,包含一些空的测试用例。手动将这些类修改完成即可。完整的CalculatorTest.java的代码如下:
      import static org.junit.Assert.*;
      
      import org.junit.Before;
      import org.junit.Test;
      
      
      public class CalculateTest {
      	
      	private static Calculator cal = new Calculator();
      
      	@Before
      	public void setUp() throws Exception {
      	}
      
      	@Test
      	public void testAdd() {		
      		assertEquals(5, cal.add(2, 3));
      	}
      
      	@Test
      	public void testSubstract() {
      		assertEquals(5, cal.substract(5, 0));
      	}
      
      	@Test
      	public void testMultiply() {
      		assertEquals(-1, cal.multiply(-1, 1));
      	}
      
      	@Test
      	public void testDivide() throws Exception {
      		cal.divide(4, 0);
      	}
      
      }
      

        

    4. 运行测试代码:右击CalculatorTest类→“Run as”→“JUnit Test”运行测试用例,如图:运行结果如下:其中,进度条为红色表示发现错误,具体测试结果在进度条上显示。

    各种注解的说明:

    @Test:

    表明该方法是一个测试方法

    @BeforeClass 和 @AfterClass:

    测试用例初始化时执行 @BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作。标注、@BeforeClass 和 @AfterClass的方法必须是static的,因为方法将在类被装载的时候就被调用,那时候还没创建测试对象实例。

    @Before: 
    使用了该元数据的方法在每个测试方法执行之前都要执行一次。

    @After: 
    使用了该元数据的方法在每个测试方法执行之后要执行一次。

    @Test(expected=*.class) :
    通过@Test元数据中的expected属性验证是否抛出期望的异常,expected属性的值是一个异常的类型,如果抛出了期望的异常,则测试通过,否则不通过。

    @Test(timeout=xxx):
    该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。

    @Ignore: 
    该元数据标记的测试方法在测试中会被忽略。同时可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore("该方法还没有实现"),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

    在test方法内除了使用Assert的assertEquals()方法外,还能使用assertFalse()、assertTrue()、assertNull()、assertNotNull()、assertSame()、assertNotSame()等断言函数。而且如果使用的是Junit4,结合Hamcrest,使用

    assertThat([value], [matcher statement])方法可以实现更灵活的断言判断(前提是引入hamcrest的jar包)。

    例如:

    // is匹配符表明如果前面待测的object等于后面给出的object,则测试通过 

    assertThat( testedObj, is( object) ); 

    // containsString匹配符表明如果测试的字符串包含指定的子字符串则测试通过

     assertThat( testedString, containsString( "developerWorks" ) );

    // greaterThan匹配符表明如果所测试的数值testedNumber大于16.0则测试通过

     assertThat( testedNumber, greaterThan(16.0) ); 

    // closeTo匹配符表明如果所测试的浮点型数testedDouble在20.0±0.5范围之内则测试通过 

    assertThat( testedDouble, closeTo( 20.0, 0.5 ) );

    //hasItem匹配符表明被测的迭代对象含有元素element项则测试通过assertThat(iterableObject, hasItem (element));

    (注:参考博客:http://blog.csdn.net/andycpp/article/details/1327147 以及 http://www.ibm.com/developerworks/cn/java/j-lo-junit4/ )

  • 相关阅读:
    微信调用相机上传照片+拍照上传
    遮罩层+软键盘
    样式问题
    连接微信分享图片
    一些链接
    图片等比例缩放
    About Memory Analysis
    Monitor Network and File I/O
    Measure Graphics Performance
    Measure CPU Use
  • 原文地址:https://www.cnblogs.com/TroyYue/p/4536502.html
Copyright © 2011-2022 走看看