Junit4学习笔记

必要的包

  1. org.junit.*
  2. import static org.junit.Assert.*;
  3. 可选的Hamcrest

Annotation注解/元数据(描述数据的数据)

  1. @BeforeClass 在类被装载的时候就被调用(还未创建实例),所以需要static方法,还需要public,且每个类仅能有一个
  2. @AfterClass
  3. @Before 每个测试方法前都要执行一次,可以用于把对象复原,以免对其他测试造成影响。这个相当于取代了JUnit以前版本中的setUp方法
  4. @After,这个相当于取代了JUnit以前版本中的tearDown方法
  5. @Test 返回值必须是void,而且无参数
  6. @Ignore(“该方法还没有实现”) ,String参数,表明为什么会忽略这个测试方法。该注解加在@Test上一行,在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接)。
  7. @Test(timeout = xxx) 该元数据传入了一个时间(毫秒)给测试方法,限制测试,超时则失败,对于逻辑很复杂,循环嵌套深,可能出现死循环的程序,可采取此预防措施
  8. @Test(expected = *.class)使用@Test标注的expected属性,将我们要检验的异常传递给他,这样JUnit框架就能自动帮我们检测是否抛出了我们指定的异常。
@Test(expected = ArithmeticException.class)      
public void divideByZero() {         
    calculator.divide(0);          
}
  1. @Paramenters 用于参数化测试

Assert类中常用方法

  1. assertEquals()
  2. assertFalse()
  3. assertTure()
  4. assertNull()
  5. assertNotNull()
  6. assertSame()
  7. assertNotSame()
  8. 结合Hamcrest,使用assertThat([value]), [matcher statement])方法可以实现更灵活的断言判断,需要引入hamcrest的jar包

Hamcrest的使用

  1. is匹配符表明如果前面待测的object等于后面给出的object,则测试通过
    assertThat( testedObj, is( object) );

  2. containsString匹配符表明如果测试的字符串包含指定的子字符串则测试通过
    assertThat( testedString, containsString( "developerWorks" ) );

  3. greaterThan匹配符表明如果所测试的数值testedNumber大于16.0则测试通过
    assertThat( testedNumber, greaterThan(16.0) );

  4. closeTo匹配符表明如果所测试的浮点型数testedDouble在20.0±0.5范围之内则测试通过
    assertThat( testedDouble, closeTo( 20.0, 0.5 ) );

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

参数化测试

把测试代码提交给JUnit框架后,框架如何来运行代码呢?答案就是——Runner。在JUnit中有很多个 Runner,他们负责调用测试代码,每一个Runner都有各自的特殊功能,要根据需要选择不同的Runner来运行测试代码。JUnit中有一个默认Runner,如果没有指定,那么系统自动使用默认 Runner来运行你的代码。
参数化测试,需要的runner就不是默认的了。@RunWith(Parameterized.class)这条语句就是为这个类指定了一个ParameterizedRunner。第二步,定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。
除此之外,还用到了注解@Paramenters,定义测试数据的集合,也就是上述的data()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。其中的数据是一个二维数组,数据两两一组,每组中的这两个数据,一个是参数,一个是你预期的结果。比如我们的第一组{2, 4},2就是参数,4就是预期的结果。这两个数据的顺序无所谓,谁前谁后都可以。之后是构造函数,其功能就是对先前定义的两个参数进行初始化。 在这里你可要注意一下参数的顺序了,要和上面的数据集合的顺序保持一致。如果前面的顺序是{参数,期待的结果},那么你构造函数的顺序也要是“构造函数(参数, 期待的结果)”,反之亦然。

import java.util.Arrays;  
import java.util.Collection;  
  
import org.junit.Assert;  
import org.junit.Test;  
import org.junit.runner.RunWith;  
import org.junit.runners.Parameterized;  
import org.junit.runners.Parameterized.Parameters;  
  
@RunWith(Parameterized.class)  
public class CalculatorTest2{  
  
    private Calculator cal = new Calculator();  
    private int param;  
    private int result;  
  
    //构造函数,对变量进行初始化  
    //定义一个待测试的类,并且定义两个变量,一个用于存放参数,一个用于存放期待的结果。  
    public CalculatorTest2(int param, int result) {  
           this.param = param;  
           this.result = result;  
    }  
      
    @Parameters  
    public static Collection data(){  
        return Arrays.asList(new Object[][]{  
            {2, 4},  
            {0, 0},  
            {-3, 9},  
      });  
    }  
  
    @Test  
    public void squareTest() {  
        int temp = cal.square(param);  
        Assert.assertEquals(result, temp);  
    }  
}  

打包测试

import org.junit.runner.RunWith;  
import org.junit.runners.Suite;  
  
/** 
 * 大家可以看到,这个功能也需要使用一个特殊的Runner, 
 * 因此我们需要向@RunWith标注传递一个参数Suite.class。 
 * 同时,我们还需要另外一个标注@Suite.SuiteClasses, 
 * 来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。 
 * 有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要, 
 * 随便起一个类名,内容全部为空既可 
 * 
 */  
@RunWith(Suite.class)  
@Suite.SuiteClasses({ CalculatorTest.class, CalculatorTest2.class })  
public class AllCalculatorTests {  
  
}  

断言和假设

断言:org.junit.Assert用于测试用例中,如果断言失败,用例即结束。
假设:org.junit.Assume用于在准备环境时判断环境是否符合要求,包括测试类的@BeforeClass,测试类的实例化,测试类的@Before。
如果假设失败,假设所处初始化代码方法立即结束,更深级别的后续工作也被忽略,相关测试用例被忽略,但与假设同级别的收尾工作还要继续执行。

参考:
http://tonl.iteye.com/blog/1948869
http://blog.csdn.net/andycpp/article/details/1329218

你可能感兴趣的:(Junit4学习笔记)