为什么要用Hamcrest匹配器框架

Hamcrest是一款软件测试框架, 可以通过现有的匹配器类检查代码中的条件.也可以通过自定义的匹配器实现.

要在JUnit中使用Hamcrest匹配器,可以用它的assertThat语句,并且可添加一个或多个匹配器.

Hamcrest一般被视作第三代匹配器框架.第一代使用断言(逻辑语句),但这样的测试不易读.第二代测试框架引入了特殊的断言方法,例如assertEquals().然而这种方式会导致编写过多类似的断言方法.Hamcrest采用了assertThat方法和匹配器表达式来确定测试是否成功,解决上述两个缺点.

Hamcrest的目标是使测试尽可能的提高可读性.例如is()方法其实就是equalTo()的包装方法

案例:

下面的代码就是一个使用Hamcrest

package com.lulu.androidtestdemo.hamcrest;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;/*** Created by lulu on 2018/3/17.*/
public class TestHamcrest {boolean a;boolean b;@Testpublic void testHamcrest() throws Exception {//下面语句的测试目的是一致的assertThat(a, equalTo(b));assertThat(a, is(equalTo(b)));assertThat(a, is(b));}
}

下面代码比较了一下pure JUnit 4和使用Hamcrest的断言语句.

// JUnit 4 for equals check
assertEquals(expected, actual);
// Hamcrest for equals check
assertThat(actual, is(equalTo(expected)));// JUnit 4 for not equals check
assertNotEquals(expected, actual);
// Hamcrest for not equals check
assertThat(actual, is(not(equalTo(expected))));

也可以通过anyOf()等方法实现匹配器的链接.

assertThat("test", anyOf(is("testing"), containsString("est")));

通常Hamcrest的错误信息也更容易阅读.(下图为Pure JUnit 4和Hamcrest错误log的对比)

assertTrue(result instanceof String);
// error message:
java.lang.AssertionErrorat org.junit.Assert.fail(Assert.java:86)at org.junit.Assert.assertTrue(Assert.java:41)at org.junit.Assert.assertTrue(Assert.java:52)
// ...assertEquals(String.class, result.getClass());
// error message:
java.lang.NullPointerExceptionat com.vogella.hamcrest.HamcrestTest.test(HamcrestTest.java:30)
// ....assertThat(result, instanceOf(String.class));
// error message:
java.lang.AssertionError:
Expected: an instance of java.lang.Stringbut: nullat org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
// ...

添加Hamcrest依赖

        <dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version><scope>test</scope></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-library</artifactId><version>1.3</version><scope>test</scope></dependency>

使用Hamcrest

示例:

Hamcrest匹配器的示例如下所示

assertThat(Long.valueOf(1), instanceOf(Integer.class));
// shortcut for instanceOf
assertThat(Long.valueOf(1), isA(Integer.class));

静态导入

使用静态导入可以使得所有匹配器都可用,更方便开发人员找到合适的匹配器.

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

一些重要的Hamcrest匹配器

下面是一些非常重要且常用的Hamcrest匹配器

  • allOf - 所有匹配条件都匹配则通过
  • anyOf - 任何一个匹配条件匹配则通过
  • not - 与匹配条件违背则通过
  • equalTo - 使用Object.equals方法测试对象相等
  • is - 与equalTo相同,仅用来提高代码可读性
  • hasToString - 测试 Object.toString方法
  • instanceOf,isCompatibleType - 测试类型
  • notNullValue,nullValue - 测试null
  • sameInstance - 测试是否是同一实例
  • hasEntry,hasKey,hasValue - 测试一个Map包含entry,key或者value
  • hasItem,hasItems - 测试一个集合包含对应元素
  • hasItemInArray - 测试一个数组包含某个元素
  • closeTo - 测试浮点值接近于给定值
  • greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo
  • equalToIgnoringCase - 测试字符串相等且忽略大小写
  • equalToIgnoringWhiteSpace - 测试字符串相等且忽略空白符
  • containsString, endsWith, startsWith - 匹配字符串

详细请看Hamcrest API: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html

使用Hamcrest内置的匹配器

集合匹配器测试集合

测试目标

假设存在下列代码:

List<Integer> list = Arrays.asList(5, 2, 4);

通过使用Hamcrest匹配器对这个list进行下列验证:

  • 大小为3
  • 包含2, 4, 5三个元素,忽略顺序
  • 每个元素都大于1

测试代码

@Test
public void hasSizeOf3() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, hasSize(3));
}
@Test
public void containsNumbersInAnyOrder() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, containsInAnyOrder(2, 4, 5));
}
@Test
public void everyItemGreaterThan1() {List<Integer> list = Arrays.asList(5, 2, 4);assertThat(list, everyItem(greaterThan(1)));
}

集合匹配器验证数组

测试目标

假设存在下列代码:

Integer[] ints = new Integer[] {7, 5, 12, 16};

通过使用Hamcrest匹配器对这个ints数组进行下列验证:

  • 长度为4
  • 以特定的顺序含有7, 5, 12, 16元素

测试代码

@Test
public void arrayHasSizeOf4() {Integer[] ints = new Integer[] { 7, 5, 12, 16 };assertThat(ints, arrayWithSize(4));
}
@Test
public void arrayContainsNumbersInGivenOrder() {Integer[] ints = new Integer[] { 7, 5, 12, 16 };assertThat(ints, arrayContaining(7, 5, 12, 16));
}

Hamcrest beans匹配器

测试目标

假设存在下面的类:

public class Todo {private final long id;private String summary;private String description;private int year;public Todo(long id, String summary, String description) {this.id = id;this.summary = summary;this.description = description;}//getter 和 setter
}

通过使用Hamcrest匹配器进行下列验证:

  • Todo类含有名叫 "summary"的属性
  • 如果Todo类被创建时给summary属性传入"Learn Hamcrest", 则summary属性会用这个值进行初始化
  • 两个对象用相同的值创建,会有相同的属性值

测试代码

    @Testpublic void objectHasSummaryProperty () {Todo todo = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo, hasProperty("summary"));}
    @Testpublic void objectHasCorrectSummaryValue () {Todo todo = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo, hasProperty("summary", equalTo("Learn Hamcrest")));}
    @Testpublic void objectHasSameProperties () {Todo todo1 = new Todo(1, "Learn Hamcrest", "Important");Todo todo2 = new Todo(1, "Learn Hamcrest", "Important");assertThat(todo1, samePropertyValuesAs(todo2));}

字符串匹配器

实现下列对字符串的检查:

  • ""是一个空字符串
  • 一个给定的字符串不是空或者null
    @Testpublic void isStringEmpty() {String stringToTest = "";assertThat(stringToTest, isEmptyString());}
    @Testpublic void isStringEmptyOfNull() {String stringToTest = "";assertThat(stringToTest, isEmptyOrNullString());}

Hamcrest 测试匹配框架相关推荐

  1. JUnit4中使用Hamcrest测试框架的assertThat断言 小实例

    ‍1.JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活: 2.使用全新的断言语法:assertThat,结合Ham ...

  2. Android测试最新框架,Android单元测试-常见的方案比较

    前言 本文将介绍在Android Studio中,android单元测试的介绍和实现.相关代码托管在github上的AndroidJunitDemo中,涉及到的用例代码收集于google官方提供的测试 ...

  3. Text to image论文精读 NAAF:基于负感知注意力的图像-文本匹配框架 Negative-Aware Attention Framework for Image-Text Matching

    NAAF:Negative-Aware Attention Framework for Image-Text Matching是基于负感知注意力的图文匹配,其利用匹配片段的积极影响和不匹配片段的消极影 ...

  4. 最好用的地图匹配框架——基于HMM的Valhalla

    最好用的地图匹配框架--基于HMM的Valhalla 地图匹配 就是将点映射到路段上的技术啦,懂得都懂哈~ 因为本人是做城市计算移动轨迹方面的研究,所以经常要对一些车辆轨迹进行地图匹配,但是由于懒得自 ...

  5. 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )

    文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 六.Activity 中测试上述框架 七.博客源码 一.消息中心 该消息中心是事件通信框架的核心代 ...

  6. 使用外部同步的 Boost.Test 调用在 MT 环境中测试单元测试框架的可用性

    使用外部同步的 Boost.Test 调用在 MT 环境中测试单元测试框架的可用性 实现功能 C++实现代码 实现功能 使用外部同步的 Boost.Test 调用在 MT 环境中测试单元测试框架的可用 ...

  7. boost::test模块针对模式文件测试单元测试框架报告功能

    boost::test模块针对模式文件测试单元测试框架报告功能 实现功能 C++实现代码 实现功能 boost::test模块针对模式文件测试单元测试框架报告功能 C++实现代码 #define BO ...

  8. Atata——C# Web测试自动化框架

    从 GitHub 下载示例 介绍 Atata Framework --基于Selenium WebDriver的C#/.NET Web测试自动化全功能框架.使用流畅的页面对象模式:拥有独特的日志系统: ...

  9. 通过python各种开源库,开发一个适合大部分公司测试项目框架,确定名字AutoTestProjects

    通过python各种开源库,开发一个适合大部分公司测试项目框架,确定名字AutoTestProjects 一,简介 1.目前市场上的框架一般都需要码农进行编写,对测试小白非常的不友好,而且现在整个IT ...

  10. 11个开源测试自动化框架,如何选?

    以下为作者观点: 如果你正在考虑建立你自己的测试自动化框架,请再想一想.在大多数情况下,你最好可以考虑一个或多个可用的开源选项. 这是因为,一般来说,框架是一套可以跨团队使用的最佳实践.假设.通用工具 ...

最新文章

  1. 一起来开发Android的天气软件(三)——使用Volley实现网络通信
  2. linux部署vue项目_Vue项目部署的最佳实践
  3. sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息
  4. 动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...
  5. linux 内核编译安装及卸载
  6. java io 读取配置文件_(转)Java 读写Properties配置文件
  7. 安卓端gis_微图手机版下载-微图(GIS软件工具)下载v2.1.7安卓版-西西软件下载
  8. List转JSON格式方法
  9. tarjan算法 转载
  10. Linux编译Ralink无线网卡驱动
  11. 商业级web阅读器项目(下下)
  12. 武大2020/4/15-关于选派全日制在校生2020/2021学年秋季赴部分欧洲高校交流学习的通知(三)
  13. 使用Pandas绘制股票均线
  14. 【前端】报错TypeError: Cannot create property ‘xxx‘ on string ‘xxx‘
  15. 黑科技之资源搜索网站
  16. 没有要使用本计算机 用户必须输入密码,要使用本计算机,用户必须输入用户名和密码选项不见了怎么办...
  17. MicroBlaze定时器(Timer)的使用
  18. 基于python获取少量图片的简单代码
  19. USRP调研及学习(GNU Radio)
  20. 千变万化的ViewPager指示器-MagicIndicator

热门文章

  1. 工厂模式的三张类图(一目了然)
  2. 图神经网络 图像处理,神经网络与图像处理
  3. WAP网站制作(WAP网站建设)全攻略教程一
  4. CocosBuilder 完全攻略
  5. 数据库(员工信息表)
  6. SAP ABAP开发视频学习(视频教程)
  7. NT平台ADSL拨号连接密码恢复原理
  8. 超详细|一篇搞定操作系统——文件管理
  9. 常用正则表达式大全(Xss防范、sql注入、手机邮箱验证等等,持续补充~)
  10. 零基础如何自学编程?