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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容