• 1
  • 1
分享

概念

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()



  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   先说重点:想要拥有被人羡慕的地位,就需要拥有足够的实力资本,所以需要我辈软件测试从业者的共同努力和发展才能实现的。  回到主题:关于软件测试行业的地位如何,那么我们来看看测试行业的平均薪资就可以很直接地得到答案。  目前:测试行业的薪资已经和开发不相上下;并且在同样10年工龄面前,测试的薪资将会超过开发。  一、国内测试给人感觉地位较低的原因  出现这个问题的主要原因就是我国互联网行业的发展历史导致的。  国内互联网行业初期,软件产品种类匮乏,用户量也比较小。  因此很多软件产品不需要经过那么专业系统的测试检测,就上线发行给用户使用,因此导致软件测试人员相对较少的和不那么专业。  而且就算...
            0 0 1311
            分享
          • 今天聊下微信小程序的抓取,其实小程序的抓取不难,主要解决抓包和如何调试小程序这两个问题。如果你运用chrome调试已经比较熟练了的话,就手到擒来。先来说小程序抓包问题不用破解的办法如何抓到小程序的包?破解是个费劲的事,一不小心微信账号还可能被封。小程序抓不到包通常就是你手机的安卓系统版本太高和微信APP的版本太高了。版本越高,通常它的安全性就越好。换用安卓系统是4.4的手机和微信APP版本在6.7左右的版本。使用Fiddler或Charles抓包妥妥的。如果你实在没有低安卓系统版本手机和低版本微信,继续看下面的文字,待会再介绍一种抓包方法。只要抓包搞定了,很多小程序也就能抓取了,剩下就是解决I...
            0 0 9333
            分享
          • 最近想研究下手机端是如何进行接口测试的,那就得先把app和微信小程序的一些测试的重点会了解,我没有做过关于微信小程序和手机app的测试,有不对的希望补充和提建议,下面是我在网上找到的一些知识的总结:功能测试:功能测试和web的测试逻辑一样,主要是理解项目的需求设计等,查看功能模块、业务流程、同一功能不同入口时有效性检查、页面交互性检查、输入输出等逻辑进行测试;权限:app是否可以访问手机通讯录、相册、相机等权限;小程序是否有微信授权,未授权/授权登录程序,同一微信号不同手机登录查看数据显示情况;兼容性测试:不同手机操作系统检验、不同微信版本(测试当前微信版本发布的项目和升级版微信后测项目)、分...
            0 0 1102
            分享
          • 测试员想要在竞争激烈的职场中拥有一席之地,就需要提前做好准备。前人栽树,后人乘凉一次面试就能入职自己心仪的公司,就需要通过“前人”积累的面试题来了解面试官的“套路”,通过不断的优化答案来提升自己的竞争力。基本问题◆ 自我介绍自我介绍时间不能太长,最多3分钟即可。介绍自己要简明扼要,主要突出重点。如果你是应届生,先介绍自己的专业,再侧重你在校获得的成就,参加的社团活动等重大的事情,一定要简明扼要,突出获得的成就即可。如果你有工作经验,教育经历稍微描述一下,主要侧重点在之前的担任的测试岗位,测试的内容,获得的成就。◆ 项目经验项目经验并不是越多越好,而是越符合招聘单位的需求越精准越好。如果你去应聘...
            0 1 3031
            分享
          •   业务需求  假设公司领导现在给你分配了一个性能测试需求如下:  1:公司有1000人在上班时间段会登录平台进行打卡操作,可能会登录打卡多次  2:业务高峰时间段在8:00-8:30,半小时  3:需要保证90%用户的响应时间在1s以内  4:保证在半小时内支撑5000笔打卡业务完成,同时90%业务时间不超过1s,半小时内最大系统并发数能达到多少?每秒最大用户并发能达到多少?  分析需求  a.1000人在30分钟内完成登录,那么每分钟有1000/30=33的人登录,每秒有0.56人登录,也就是2s中有1个人登录;  b.5000笔打卡业务在30分钟内完成,那么每秒中需要完成5000/(30...
            7 7 4045
            分享
      • 51testing软件测试圈微信