概念

Hamcrest是用于编写匹配器对象的框架。他提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。Hamcrest还有很好的可扩展性,能够创建自定义的匹配器。

支持语言

Hamcest支持多种语言,在Hamcest 官网便可以看到:http://hamcrest.org/JavaPython

  • Ruby
  • Objective-C
  • PHP
  • Erlang
  • Swift

示例

from hamcrest import *
import unittest class BiscuitTest(unittest.TestCase):
def testEquals(self):
theBiscuit = 'Ginger'
myBiscuit = 'Ginger'
assert_that(theBiscuit, equal_to(myBiscuit)) if __name__ == '__main__':
unittest.main()

assert_that函数是用于测试断言的语句。 在如上示例中,theBiscuit 是第一个方法参数,第二个方法参数是对象的匹配器,这里使用的是Python中 ==运算符检查一个对象与另一个对象相等。

Hamcres API

在python中pyHamcrest属于第三方库,使用时需要安装。

Hamcrest在python中提供的API:

对象

  • equal_to - 匹配相等对象
  • has_length - 长度匹配 len()
  • has_property - 匹配给定名称的属性值
  • has_properties - 匹配具有所给定属性的对象
  • has_string - 匹配字符串 str()
  • instance_of - 匹配对象类型
  • none, not_none - 匹配none或not none
  • same_instance - 匹配相同的对象
  • calling, raises - 封装一个方法调用并断言它引发异常

数字

  • close_to - 匹配接近给定的数字值
  • greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to - 匹配数字顺序

文本

  • contains_string - 匹配部分字符串
  • ends_with - 匹配字符串的结尾
  • equal_to_ignoring_case - 匹配完整的字符串但忽略大小写
  • equal_to_ignoring_whitespace - 匹配完整的字符串,但忽略多余的空格
  • matches_regexp - 使用正则表达式匹配字符串
  • starts_with - 匹配字符串的开头
  • string_contains_in_order - 按相对顺序匹配字符串的各个部分

逻辑

  • all_of - 如果所有匹配器都匹配才匹配,像Java里的&&
  • any_of - - 如果任何匹配器匹配就匹配,像Java里的||
  • anything - 匹配任何东西,如果不关心特定值则在复合匹配器中很有用
  • is_not, not_ -如果包装的匹配器不匹配器时匹配,反之亦然

序列

  • contains - 完全匹配整个序列
  • contains_inanyorder - 以任何顺序匹配整个序列
  • has_item - 只要给定项目在序列中出现则匹配
  • has_items - 如果所有给定项以任意顺序出现在序列中则匹配
  • is_in - 在给定顺序中如果给定项出现则匹配
  • only_contains - 在给定顺序中如果序列的项目出现则匹配
  • empty - 如果序列为空则匹配

字典

  • has_entries - 匹配具有键值对列表的字典
  • has_entry - 匹配包含键值对的字典
  • has_key - 使用键匹配字典
  • has_value - 使用值匹配字典

装饰器

  • calling - 在延迟中封装一个可调用对象,在后续的调用行为中匹配
  • raises - 确保延迟调用可以按预期方式引发
  • described_as - 添加一个定制的失败表述装饰器
  • is_ - 改进可读性装饰器

这些匹配器中的许多参数不仅接受匹配值,还接受另一个匹配器,因此可以组合匹配器以提高灵活性。 例如,only_contains(less_than(5))将匹配每个小于5项目的任何序列。

自定义匹配器

PyHamcrest捆绑了许多有用的匹配器,但是在我们使用时会发现有时需要创建自己的匹配器来满足测试需求。一般来说, 当一段代码重复测试同一组属性(以及在不同测试中)并且希望将该代码段捆绑到一个断言中时, 通过编写自己的匹配器可以消除代码重复,并使测试更具可读性!

编写一个匹配器用来测试日历日期是不是在星期六。实现后希望使用的结果:

def testDateIsOnASaturday(self):
d = datetime.date(2008, 4, 26)
assert_that(d, is_(on_a_saturday()))

代码实现:

from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.helpers.hasmethod import hasmethod class IsGivenDayOfWeek(BaseMatcher): def __init__(self, day):
self.day = day # Monday is 0, Sunday is 6 def _matches(self, item):
if not hasmethod(item, 'weekday'):
return False
return item.weekday() == self.day def describe_to(self, description):
day_as_string = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
'Friday', 'Saturday', 'Sunday']
description.append_text('calendar date falling on ') \
.append_text(day_as_string[self.day]) def on_a_saturday():
return IsGivenDayOfWeek(5)

对于Matcher的实现,使用_matches方法,在确认参数有这样一个方法并且在测试失败时使用 describe_to 方法来生成失败消息。下面是一个断言失败的消息示例:

assert_that(datetime.date(2008, 4, 6), is_(on_a_saturday()))

消息失败后给出的提示:

AssertionError:
Expected: is calendar date falling on Saturday
got: <2008-04-06>

将这个匹配器保存在名为 isgivendayofweek的MODULE 中。 以后可以通过导入函数 on_a_saturday 在测试中使用:

from hamcrest import *
import unittest
from isgivendayofweek import on_a_saturday class DateTest(unittest.TestCase):
def testDateIsOnASaturday(self):
d = datetime.date(2008, 4, 26)
assert_that(d, is_(on_a_saturday())) if __name__ == '__main__':
unittest.main()

pyHamcrest的更多相关文章

  1. [已解决]报错: twisted 18.7.0 requires PyHamcrest>=1.9.0

    1.下载对应的Twisted,下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 2.通过Anaconda3的Anaconda Promp ...

  2. 使用 PyHamcrest 执行健壮的单元测试

    在 测试金字塔 的底部是单元测试.单元测试每次只测试一个代码单元,通常是一个函数或方法. 通常,设计单个单元测试是为了测试通过一个函数或特定分支的特定执行流程,这使得将失败的单元测试和导致失败的 bu ...

  3. Python 资源大全中文版

    Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...

  4. [转载]Python 资源大全

    原文链接:Python 资源大全 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex  ...

  5. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  6. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...

  7. python 第三方模块 转 https://github.com/masterpy/zwpy_lst

    Chardet,字符编码探测器,可以自动检测文本.网页.xml的编码. colorama,主要用来给文本添加各种颜色,并且非常简单易用. Prettytable,主要用于在终端或浏览器端构建格式化的输 ...

  8. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  9. Python 库大全

    作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

随机推荐

  1. Zero down time upgrade with OGG -from 11g to 12c.

    High level steps upgrade from 11g to 12c database: 1)    Check network between source and target. 2) ...

  2. [bzoj3991] [洛谷P3320] [SDOI2015] 寻宝游戏

    Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有 \(N\) 个村庄和 \(N-1\) 条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬 ...

  3. MySQL军规升级版(转)

    一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读:(1)通用,无乱码风险,汉字3字节,英文1字节(2)utf8mb4是utf8的超集,有存储4字 ...

  4. 《Sequence Models》课堂笔记

    Lesson 5 Sequence Models 这篇文章其实是 Coursera 上吴恩达老师的深度学习专业课程的第五门课程的课程笔记. 参考了其他人的笔记继续归纳的. 符号定义 假如我们想要建立一 ...

  5. 机器学习环境配置系列四之theano

    决定撰写机器学习环境配置的主要原因就是因为theano的配置问题,为了能够用上gpu和cudnn加速,我是费劲了力气,因为theano1.0.0在配置方面出现了重大改变,而网上绝大多数都很老,无法解决 ...

  6. 团队作业-Alpha版本发布2

    团队项目-系统设计 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework 这个作业要 ...

  7. Python学习,第一课 - 基础学习

    前言. 本内容全部以python3所讲 一.Python安装 windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\pyth ...

  8. Image Retargeting - 图像缩略图 图像重定向

    Image Retargeting 图像缩略图.图像重定向 前言 这篇文章主要对比DL出现之前的几种上古算法,为了作为DL方法的引子而存在,顺便博客也该更新点新内容上来了,这篇博文就是介绍了我最近在玩 ...

  9. CSDN

    链接:https://blog.csdn.net/shaoyedeboke

  10. STM32系列之初探(二)

    问题一: 什么是STM32 新的基于ARM内核的32位MCU系列 内核为ARM公司为要求高性能,低成本,低功耗的嵌入式应用专门设计的Crotex-M内核 标准的ARM体系 特点: 高性能 低电压 低功 ...