一.Junit4断言

assertEquals(a, b)

assertFalse(a)

assertTrue(a)       

assertNotNull(a)

assertNull(a)

assertNotSame(a, b)

assertSame(a, b)  

   @Test

   publicvoid testAssert() throws Exception {

       int expectNum = 123;

       int actuNum = 123;

       String storeId ="123456";     

       // assertEquals(expect,actual),测试expect是否等于actual(expect和actual是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

       assertEquals(expectNum, actuNum);//运行成功

       assertEquals(storeId,"12345");//运行失败

       //assertFalse(condition)测试是否为false(假),condition是一个Boolean数值

       assertFalse(expectNum==100);//运行成功

       // assertTrue(condition)    测试是否为true(真),condition是一个Boolean数值

       assertTrue(expectNum==123);//运行成功      

       //assertNotNull(object),测试object是否非空,object是一个对象或者null。

       PingJia pingjia=null;

       assertNotNull(pingjia);//运行失败

       //assertNull(object),测试object是否非空,object是一个对象或者null。

       assertNull(pingjia);//运行成功

       // assertNotSame(unexpected, actual)测试unexpected和actual是否没有都引用同一个对象。

       String storeId1 = storeId;

       assertNotSame(storeId, storeId1);//运行失败

       // assertSame(unexpected, actual)测试unexpected和actual是否没有都引用同一个对象。

       assertSame(storeId, storeId1);//运行成功 

   }

 

二.junit新断言

1.       JUnit4.4引入了Hamcrest框架,使用全新的断言语法:assertThat,结合Hamcest提供的匹配符,只用这一个方法,就可以实现所有的测试,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活;

2.       assertThat语法如下:

 assertThat(T actual, Matcher<T> matcher);

assertThat(String reason, T actual, Matcher<T> matcher);

actual是接下来想要验证的值;
matcher是使用Hamcrest匹配符来表达的对前面变量所期望的值的声明,如果actual值与matcher所表达的期望值相符,则断言成功,否则断言失败。

reason是自定义的断言失败时显示的信息。

3.       注意事项:

    a. JUnit4.4之后的版本才能使用assertThat方法;

4.       优点

  1. 1.       统一:只需一条assertThat语句即可替代旧有的其他语句(如assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull等),使断言变得简单、代码风格统一,增强测试代码的可读性和可维护性。
  1. 2.       直观:assertThat不再像assertEquals那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);)。相反,assertThat使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读,符合人类思维习惯。
  1. 3.       错误信息更具描述性

旧的断言语法如果断言失败,默认不会有额外的提示信息,如assertTrue(testedString.indexOf(”taobao”) > -1);如果该断言失败,只会抛出无用的错误信息,如java.lang.AssertionError:,除此之外不会有更多的提示信息。

新的断言语法会默认自动提供一些可读的描述信息,如

assertThat(testedString, containsString(”taobao”));

如果该断言失败,抛出的错误提示信息如下:

java.lang.AssertionError:

Expected: a string containing “taobao”

got: “taoba”

4.       跟Matcher匹配符联合使用更灵活强大

 

需要增加hamcrest 

测试类里导入包

 

import static org.junit.Assert.*;//assertThat跟下面的Matchers配合使用

import static com.taobao.itest.matcher.Matchers.*;//增加了反射相关的匹配,比如验证两个对象的某几个属性相同

 

   //通用匹配符

   @Test

   publicvoid testAssert_nomarl() throws Exception {

      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

   publicvoid testAssert_String() throws Exception {

       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

   publicvoid testAssert_set() throws Exception {

       List<String> list =new ArrayList<String>();

       list.add("123456");

      // hasItem:Iterable变量中含有指定元素时,测试通过

      assertThat(list,hasItem("123456"));//运行成功

      Mapmap =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

   publicvoid testAdd_Assert_rel() throws Exception {

       PingJia pingjia1 =new PingJia();

pingjia1.set

       PingJia pingjia2 =new  vPingJia();

       //断言两个对象所有属性值相等

      assertThat(pingjia1,propertiesEquals(pingjia2));

       //断言两个对象指定属性值相等

      assertThat(pingjia1,propertiesEquals(pingjia2,"pingJiaType",

             "pingJiaDate"));

       //断言两个对象除指定属性外其他属性值相等  

      assertThat(pingjia1,excludedPropertiesEquals(pingjia2,"pingJiaType",

             "pingJiaDate"));

   }

posted on 2014-04-02 14:41  随我畅翔  阅读(341)  评论(0)    收藏  举报