一、Junit4断言
assertEquals(a, b) |
二、junit新断言
1、JUnit4.4引入了Hamcrest框架,使用全新的断言语法:assertThat,结合Hamcest提供的匹配符,只用这一个方法,就可以实现所有的测试,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活;
2、assertThat语法如下:
assertThat(T actual, Matcher<T> matcher); |
actual是接下来想要验证的值;
matcher是使用Hamcrest匹配符来表达的对前面变量所期望的值的声明,如果actual值与matcher所表达的期望值相符,则断言成功,否则断言失败。
reason是自定义的断言失败时显示的信息。
3、注意事项:
a. JUnit4.4之后的版本才能使用assertThat方法;
4、优点
1)统一:只需一条assertThat语句即可替代旧有的其他语句(如assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull等),使断言变得简单、代码风格统一,增强测试代码的可读性和可维护性。
2)直观:assertThat不再像assertEquals那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);)。相反,assertThat使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读,符合人类思维习惯。
3)错误信息更具描述性
旧的断言语法如果断言失败,默认不会有额外的提示信息,如assertTrue(testedString.indexOf(”taobao”)> -1);如果该断言失败,只会抛出无用的错误信息,如java.lang.AssertionError:,除此之外不会有更多的提示信息。
新的断言语法会默认自动提供一些可读的描述信息,如
assertThat(testedString, containsString(”taobao”)); |
如果该断言失败,抛出的错误提示信息如下:
java.lang.AssertionError: |
4)跟Matcher匹配符联合使用更灵活强大
需要增加hamcrest包
在测试类里导入包
Import static org.junit.Assert.*;//assertThat跟下面的Matchers配合使用 Import static com.taobao.itest.matcher.Matchers.*;//增加了反射相关的匹配,比如验证两个对象的某几个属性相同 //通用匹配符 @Test Public void testAssert_nomarl()throwsException { Int num = 200; String storeId ="123456"; // allOf:所有条件必须都成立 assertThat(num,allOf(greaterThan(100),lessThan(300)));//运行成功 assertThat(num,allOf(greaterThan(100),lessThan(150)));//运行失败 // anyOf:只要有一个条件成立 assertThat(num,allOf(greaterThan(100),lessThan(150)));//运行成功 assertThat(storeId,anyOf(equalTo("123456"),equalTo("1234")));//运行成功 // anything:无论什么条件 assertThat(num,anything()); //运行成功 // is:变量的值等于指定值时 assertThat(storeId,is("123456"));//运行成功 assertThat(num,is("200"));//运行成功 // not:和is相反,变量的值不等于指定值时 assertThat(storeId, notis("123456"));//运行成功 } /字符串相关匹配符 @Test publicvoidtestAssert_String()throwsException { String storeId ="assertTest"; //字符串匹配符 assertThat(storeId,containsString("assert"));//运行成功 // startsWith:字符串变量以指定字符串开头时 assertThat(storeId,startsWith("assert"));//运行成功 // endsWith:字符串变量以指定字符串结尾时 assertThat(storeId,endsWith("t"));//运行成功 // euqalTo:字符串变量等于指定字符串时 assertThat(storeId,equalTo("assertTest"));//运行成功 // equalToIgnoringCase:字符串变量在忽略大小写的情况下等于指定字符串时 assertThat(storeId,equalToIgnoringCase("assertTEst"));//运行成功 // equalToIgnoringWhiteSpace:匹配符断言被测的字符串testedString在忽略头 //尾的任意个空格的情况下等于expectedString,注意:字符串中的空格不能被忽 assertThat(storeId,equalToIgnoringWhiteSpace(" assertTest "));//运行成功 assertThat(storeId,equalToIgnoringWhiteSpace(" assert Test "));//运行失败 } |
//数字相关匹配符
@Test
publicvoidtestAssert_Data()throwsException{
doubled = 3.02;
// closeTo:浮点型变量的值在3.0¡À0.5范围内,
assertThat(d,closeTo(3.0, 0.5));//运行成功
// greaterThan:变量的值大于指定值时,测试通过
assertThat(d,greaterThan(3.0));//运行成功
// lessThan:变量的值小于指定值时,测试通过
assertThat(d,lessThan(3.5));//运行成功
// greaterThanOrEuqalTo:变量的值大于等于指定值时,测试通过
assertThat(d,greaterThanOrEqualTo(3.02));//运行成功
// lessThanOrEqualTo:变量的值小于等于指定值时,测试通过
assertThat(d,lessThanOrEqualTo(3.0));//运行成功
}
//集合相关匹配符
@Test
publicvoidtestAssert_set()throwsException{
List<String> list =new ArrayList<String>();
list.add("123456");
// hasItem:Iterable变量中含有指定元素时,测试通过
assertThat(list,hasItem("123456"));//运行成功
Map map =new HashMap();
map.put("id","123456");
map.put("name","test");
// hasEntry:Map变量中含有指定键值对时,测试通过
assertThat(map,hasEntry("id","123456"));//运行成功
// hasKey:Map变量中含有指定键时,测试通过
assertThat(map,hasKey("id"));//运行成功
// hasValue:Map变量中含有指定值时,测试通过
assertThat(map,hasValue("123456"));//运行成功
}
//反射相关匹配符
@Test
publicvoidtestAdd_Assert_rel()throwsException{
PingJia pingjia1 =newPingJia();
pingjia1.set
PingJia pingjia2 =newPingJia();
//断言两个对象所有属性值相等
assertThat(pingjia1,propertiesEquals(pingjia2));
//断言两个对象指定属性值相等
assertThat(pingjia1,propertiesEquals(pingjia2,"pingJiaType",
"pingJiaDate"));
//断言两个对象除指定属性外其他属性值相等
assertThat(pingjia1,excludedPropertiesEquals(pingjia2,"pingJiaType",
"pingJiaDate"));
}