一个简单的测试用例

初看起来,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

 






(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) { 
  
 
  

    } 
  
 
  

    }