Junit 断言 assertThat Hamcrest匹配器
2016-11-30 10:57
148 查看
junit断言总结 本文参考了http://blog.csdn.net/wangpeng047/article/details/9628449 一junit断言 1.JUnit框架用一组assert方法封装了最常见的测试任务。这些assert方法可以极大地简化单元测试的编写。 Assert类包含了一组静态的测试方法,用于验证期望值expected和实际值actual逻辑比对是否正确,即测试失败,标志为未通过测试。 如果期望值和实际值比对失败,Assert类就会抛出一个AssertionFailedError异常,Junit测试框架将这种错误归入Fails并且加以记录。 每一个Assert类所属的方法都会被重载(OverLoaded),如果指定了一个String类型的传参则该参数将被做为AssertionFailedError异常的标识信息,告诉测试人员该异常的具体信息。 定义assert方法的辅助类的名称:Assert类。这个类包含了很多对于编写测试很有用的具体代码。 2.核心断言方法: assertArrayEquals(expecteds,actuals)查看两个数组是否相等。 assertEquals(expected,actual)查看两个对象是否相等。类似于字符串比较使用的equals()方法 assertNotEquals(first,second)查看两个对象是否不相等。 assertNull(object)查看对象是否为空。 assertNotNull(object)查看对象是否不为空。 assertSame(expected,actual)查看两个对象的引用是否相等。类似于使用“==”比较两个对象 assertNotSame(unexpected,actual)查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象 assertTrue(condition)查看运行结果是否为true。 assertFalse(condition)查看运行结果是否为false。 assertThat(actual,matcher)查看实际值是否满足指定的条件 fail()让测试失败 3.注解: @Before初始化方法 @After释放资源 @Test测试方法,在这里可以测试期望异常和超时时间 @Ignore忽略的测试方法 @BeforeClass针对所有测试,只执行一次,且必须为staticvoid @AfterClass针对所有测试,只执行一次,且必须为staticvoid @RunWith指定测试类使用某个运行器 @Parameters指定测试类的测试数据集合 @Rule允许灵活添加或重新定义测试类中的每个测试方法的行为 @FixMethodOrder指定测试方法的执行顺序 一个测试类单元测试的执行顺序为: @BeforeClass–>@Before–>@Test–>@After–>@AfterClass 4.基本用法:
packagetest; importstaticorg.hamcrest.CoreMatchers.*; importstaticorg.junit.Assert.*; importjava.util.Arrays; importorg.hamcrest.core.CombinableMatcher; importorg.junit.Test; publicclassAssertTests{ @Test publicvoidtestAssertArrayEquals(){ byte[]expected="trial".getBytes(); byte[]actual="trial".getBytes(); org.junit.Assert.assertArrayEquals("failure-bytearraysnotsame",expected,actual); } @Test publicvoidtestAssertEquals(){ org.junit.Assert.assertEquals("failure-stringsnotsame",5l,5l); } @Test publicvoidtestAssertFalse(){ org.junit.Assert.assertFalse("failure-shouldbefalse",false); } @Test publicvoidtestAssertNotNull(){ org.junit.Assert.assertNotNull("shouldnotbenull",newObject()); } @Test publicvoidtestAssertNotSame(){ org.junit.Assert.assertNotSame("shouldnotbesameObject",newObject(),newObject()); } @Test publicvoidtestAssertNull(){ org.junit.Assert.assertNull("shouldbenull",null); } @Test publicvoidtestAssertSame(){ IntegeraNumber=Integer.valueOf(768); org.junit.Assert.assertSame("shouldbesame",aNumber,aNumber); } //JUnitMatchersassertThat @Test publicvoidtestAssertThatBothContainsString(){ org.junit.Assert.assertThat("albumen",both(containsString("a")).and(containsString("b"))); } @Test publicvoidtestAssertThathasItemsContainsString(){ org.junit.Assert.assertThat(Arrays.asList("one","two","three"),hasItems("one","three")); } @Test publicvoidtestAssertThatEveryItemContainsString(){ org.junit.Assert.assertThat(Arrays.asList(newString[]{"fun","ban","net"}),everyItem(containsString("n"))); } //CoreHamcrestMatcherswithassertThat @Test publicvoidtestAssertThatHamcrestCoreMatchers(){ assertThat("good",allOf(equalTo("good"),startsWith("good"))); assertThat("good",not(allOf(equalTo("bad"),equalTo("good")))); assertThat("good",anyOf(equalTo("bad"),equalTo("good"))); assertThat(7,not(CombinableMatcher.<Integer>either(equalTo(3)).or(equalTo(4)))); assertThat(newObject(),not(sameInstance(newObject()))); } }
二assertThat的用法
1.一些基本的断言,如eqaul,null,true它们的可读性并不是很好,有时我们不得不自己编写表达式并断言其结果,并且因为我们没有提供失败的信息,当这个断言失败时只会抛出java.lang.AssertionError,无法知道到底是哪一部分出错。 JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。并且使用全新的断言语法:assertThat,结合Hamcest提供的匹配符,只用这一个方法,就可以实现所有的测试。 2.assertThat语法如下: assertThat(Tactual,Matchermatcher); assertThat(Stringreason,Tactual,Matchermatcher); 其中reason为断言失败时的输出信息,actual为断言的值或对象,matcher为断言的匹配器,里面的逻辑决定了给定的actual对象满不满足断言 3.注意事项: a.必须导入JUnit4.4之后的版本以及hamcrest-core.jar和hamcrest-library.jar才能使用assertThat方法;b.不需要继承TestCase类,但是需要测试方法前必须加“@Test”。 c.要用junit中的assertThat来进行断言,记住静态导入: importstaticorg.hamcrest.MatcherAssert.assertThat; importstaticorg.hamcrest.Matchers.*; importstaticorg.junit.Assert.*; 三Hamcrest匹配器的用法
Hamcrest是一个测试的框架,它提供了一套通用的匹配符Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。 hamcrest常用的匹配器: 核心: anything-总是匹配,如果你不关心测试下的对象是什么是有用的 describedAs-添加一个定制的失败表述装饰器 is-改进可读性装饰器-见下“Sugar” 逻辑: allOf-如果所有匹配器都匹配才匹配,像Java里的&& anyOf-如果任何匹配器匹配就匹配,像Java里的|| not-如果包装的匹配器不匹配器时匹配,反之亦然 对象: equalTo-测试对象相等使用Object.equals方法 hasToString-测试Object.toString方法 instanceOf,isCompatibleType-测试类型 notNullValue,nullValue-测试null sameInstance-测试对象实例 Beans: hasProperty-测试JavaBeans属性 集合: array-测试一个数组元素testanarray’selementsagainstanarrayofmatchers hasEntry,hasKey,hasValue-测试一个Map包含一个实体,键或者值 hasItem,hasItems-测试一个集合包含一个元素 hasItemInArray-测试一个数组包含一个元素 数字: closeTo-测试浮点值接近给定的值 greaterThan,greaterThanOrEqualTo,lessThan,lessThanOrEqualTo-测试次序 文本: equalToIgnoringCase-测试字符串相等忽略大小写 equalToIgnoringWhiteSpace-测试字符串忽略空白 containsString,endsWith,startsWith-测试字符串匹配
举个例子:
@Test publicvoidtestHamcrest(){ //比较50是否和50相等 assertThat(50,equalTo(50)); //50是否大于30并且小于60 assertThat("错误",50,allOf(greaterThan(30),lessThan(60))); //判断字符串是否以.txt结尾 assertThat("错误","abc.txt",endsWith(".txt")); }四TestSuite
如果有多个测试操作类,那么一个一个来运行测试就很不方便,所以通过testsuit可以把多个测试类“捆绑”起来,一起测试!
例如,一个工程有三个测试类,TestA,TestB和TestCalculate,我们可以再建一个类TestSuit,把这些类进行打包,然后同时运行测试。
importorg.junit.runner.RunWith; importorg.junit.runners.Suite; importorg.junit.runners.Suite.SuiteClasses; //RunWith表示这个类是一个suite的类 @RunWith(Suite.class) //说明这个类中包含哪些测试组建 @SuiteClasses({TestA.class, TestB.class, TestCalculate.class}) publicclassTestSuit{ /* *测试原则: *1、建议创建一个专门的sourcefolder--->test来编写测试类代码 *2、测试类的包应该保持和需要测试的类一致 *3、测试单元中的每个测试方法都必须可以独立执行,没有次序,不能有任何互相依赖 */ }
然后直接运行TestSuit这个类就可以测试所选的测试类了。
相关文章推荐
- junit 断言assertThat使用
- JUnit中使用Hamcrest测试框架的assertThat断言【4.4新特性】
- 使用junit Assert 断言来判断参数是否为空
- Junit 断言 assertThat, assertEquals, assertTrue
- JUnit 测试-Assert断言相关方法简析
- JUnit【1】断言用法之assertEquals/True/False/ArrayEquals
- junit测试assert各种断言用法
- JUnit之断言assert
- JUnit 单元测试断言推荐 AssertJ
- JUnit之断言assert
- JUnit中使用Hamcrest测试框架的assertThat断言【4.4新特性】
- JUnit中使用Hamcrest测试框架的assertThat断言
- JUnit_断言
- 断言(ASSERT)的用法
- 断言assert
- C/C++ 中的assert()宏 断言机制
- SQL Server 运行计划操作符具体解释(1)——断言(Assert)
- 断言assert()函数的使用
- 断言:利用ASSERT宏定位软件bug
- 【c++11】static_assert: 静态断言 type traits:类型特征