zoukankan      html  css  js  c++  java
  • testNg vs junit 4.X @Test

    http://www.ibm.com/developerworks/cn/java/j-cq08296/

    一个简单的测试用例

    初看起来,JUnit 4 和 TestNG 中实现的测试非常相似。为了更好地理解我的意思,请看一下清单 1 中的代码。这是一个 JUnit 4 测试,它有一个 macro-fixture(即仅在所有测试运行前调用一次的 fixture),这个 macro-fixture 由 @BeforeClass 属性表示:

    清单 1. 一个简单的 JUnit 4 测试用例
    package test.com.acme.dona.dep;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    public class DependencyFinderTest {
     private static DependencyFinder finder;
    
     @BeforeClass
     public static void init() throws Exception {
      finder = new DependencyFinder();
     }
    
     @Test
     public void verifyDependencies() 
      throws Exception {
       String targetClss = 
         "test.com.acme.dona.dep.DependencyFind";
    
       Filter[] filtr = new Filter[] { 
          new RegexPackageFilter("java|junit|org")};
    
       Dependency[] deps = 
          finder.findDependencies(targetClss, filtr);
    
       assertNotNull("deps was null", deps);
       assertEquals("should be 5 large", 5, deps.length);	
     }
    }

    JUnit 用户会立即注意到:这个类中没有了以前版本的 JUnit 中所要求的一些语法成分。这个类没有 setUp() 方法,也不对 TestCase 类进行扩展,甚至也没有哪个方法的名称以 test 开始。这个类还利用了 Java 5 的一些特性,例如静态导入,很明显地,它还使用了注释。

    更多的灵活性

    在清单 2 中,您可以看到同一个 测试项目。不过这次是用 TestNG 实现的。这里的代码跟清单 1 中的测试代码有个微妙的差别。发现了吗?

    清单 2. 一个 TestNG 测试用例
    package test.com.acme.dona.dep;
    
    import static org.testng.Assert.assertEquals;
    import static org.testng.Assert.assertNotNull;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Configuration;
    import org.testng.annotations.Test;
    
    public class DependencyFinderTest {
     private DependencyFinder finder;
    
     @BeforeClass
     private void init(){
      this.finder = new DependencyFinder();
     }
    
     @Test
     public void verifyDependencies() 
      throws Exception {
       String targetClss = 
         "test.com.acme.dona.dep.DependencyFind";
    
       Filter[] filtr = new Filter[] { 
          new RegexPackageFilter("java|junit|org")};
    
       Dependency[] deps = 
          finder.findDependencies(targetClss, filtr);
       
       assertNotNull(deps, "deps was null" );
       assertEquals(5, deps.length, "should be 5 large");		
     }
    }

    显然,这两个清单很相似。不过,如果仔细看,您会发现 TestNG 的编码规则比 JUnit 4 更灵活。清单 1 里,在 JUnit 中我必须把 @BeforeClass 修饰的方法声明为 static,这又要求我把 fixture,即 finder 声明为 static。我还必须把 init() 声明为 public。看看清单 2,您就会发现不同。这里不再需要那些规则了。我的 init() 方法既不是 static,也不是 public

    从最初起,TestNG 的灵活性就是其主要优势之一,但这并非它惟一的卖点。TestNG 还提供了 JUnit 4 所不具备的其他一些特性。

     

    junit4.x

    (1)、使用junit4.x版本进行单元测试时,不用测试类继承TestCase父类,因为,junit4.x全面引入了Annotation来执行我们编写的测试。[4] 
    (2)、junit4.x版本,引用了注解的方式,进行单元测试;
    (3)、junit4.x版本我们常用的注解:
    A、@Before 注解:与junit3.x中的setUp()方法功能一样,在每个测试方法之前执行;
    B、@After 注解:与junit3.x中的tearDown()方法功能一样,在每个测试方法之后执行;
    C、@BeforeClass 注解:在所有方法执行之前执行;
    D、@AfterClass 注解:在所有方法执行之后执行;
    E、@Test(timeout = xxx) 注解:设置当前测试方法在一定时间内运行完,否则返回错误;
    F、@Test(expected = Exception.class) 注解:设置被测试的方法是否有异常抛出。抛出异常类型为:Exception.class;
    G、@Ignore 注解:注释掉一个测试方法或一个类,被注释的方法或类,不会被执行。
    demo:
    package com.an.junit;
    import static org.junit.Assert.*;
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    public class TestMyNumber {
    private MyNumber myNumber;
    @BeforeClass
    // 在所有方法执行之前执行
    public static void globalInit() {
    System.out.println("init all method...");
    }
    @AfterClass
    // 在所有方法执行之后执行
    public static void globalDestory() {
    System.out.println("destory all method...");
    }
    @Before
    // 在每个测试方法之前执行
    public void setUp() {
    System.out.println("start setUp method");
    myNumber = new MyNumber();
    }
    @After
    // 在每个测试方法之后执行
    public void tearDown() {
    System.out.println("end tearDown method");
    }
    @Test(timeout=600)// 设置限定测试方法的运行时间 如果超出则返回错误
    public void testAdd() {
    System.out.println("testAdd method");
    int result = myNumber.add(2, 3);
    assertEquals(5, result);
    }
    @Test
    public void testSubtract() {
    System.out.println("testSubtract method");
    int result = myNumber.subtract(1, 2);
    assertEquals(-1, result);
    }
    @Test
    public void testMultiply() {
    System.out.println("testMultiply method");
    int result = myNumber.multiply(2, 3);
    assertEquals(6, result);
    }
    @Test
    public void testDivide() {
    System.out.println("testDivide method");
    int result = 0;
    try {
    result = myNumber.divide(6, 2);
    } catch (Exception e) {
    fail();
    }
    assertEquals(3, result);
    }
    @Test(expected = Exception.class)
    public void testDivide2() throws Exception {
    System.out.println("testDivide2 method");
    myNumber.divide(6, 0);
    fail("test Error");
    }
    public static void main(String[] args) {
    }
    }
  • 相关阅读:
    tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
    listview去掉底部多出的边框黑色
    使用fragmenttabhost后,子fragment怎么获取ID?怎么用getSharedPreferences
    android用shape给linearLayout设置边框,怎样只保留底部或顶部的边框,把其它三个方向的边框去掉呢?
    linux删除文件未释放空间问题处理
    mount: unknown filesystem type 'LVM2_member'解决方案【转】
    centos系统lvm的安装
    一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户
    php SimpleXML
    new JSONObject(str)无法解析 报错:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  • 原文地址:https://www.cnblogs.com/diegodu/p/6098729.html
Copyright © 2011-2022 走看看