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



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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   TikTok正在接受英国媒体监管机构的调查,原因是这款中资视频应用提供了有关其家长控制的"不准确"信息。英国通信管理局周四表示,它有"合理的理由相信"字节跳动旗下的 TikTok 违反了其法律责任,并表示可能会采取强制措施。  调查消息传出后,TikTok 在发言中指责是技术问题导致其提供的数据不准确。该公司表示已通知监管机构,并正在迅速纠正这一问题。该公司表示,计划尽快提供准确的数据。  通信管理局曾要求 TikTok 提供信息,以了解和监控该病毒视频平台的家长控制是如何工作的。监管机构周四表示,"现有证据表明,所提供的信息......可...
            0 0 1009
            分享
          • 一、接口自动化测试流程1、需求分析;请求(url、方法、数据)响应(响应数据、状态码)2、挑选需要做自动化接口(时间、人员、接口复杂度);3、设计自动化测试用例(如果功能阶段设计过用例,直接拿过来使用即可);4、搭建自动化测试环境(实现自动化使用的语言 如:(python、pycharm));5、设计自动化执行框架(报告、参数化、用例执行框架);6、编写代码;7、执行用例(unittest、pytest);8、生成测试报告(htmltextrunn er\allure)。二、接口清单整理登录接口请求登陆接口请求请求url:http://ttapi.research.itcast.cn/app/...
            0 0 1388
            分享
          • 一、个人的基本信息,扬长避短1、年纪太大与太小,都不需要主动去说明。比如我年纪只有21岁例子:面试官您好,我叫***,来自于哪里,从事软件测试工作有几年了。2、专业不对口也不要过多的去提及(提到了就会增加问你的概率)。比如你的专业是机械专业例子:面试官您好,我叫***,来自于哪里,从事软件测试工作有几年了。比如你的专业是计算机专业例子:面试官您好,我叫***,来自于哪里,计算机专业毕业后,从事软件测试工作有几年了。二、突出自己的工作经验自己的项目经验(重点突出跟你面试公司相关或者同类型的项目)。比如公司从事的主要是web项目:以前主要是从事web系统的项目,做过不少的项目,也积累了不少的测试经...
            15 13 2839
            分享
          •   在天网查上看了一下全国软件公司有1000多万家,其中上市的公司有7万多家,也就是占比0.7%。  通过这个数据可以发现,大部分公司从实力和规模上都偏向中型或者小型,也就说其中的流程不一定很健全,甚至没有流程而言。  下图截取了两张数据的图片供参考:图1  全国软件公司数据图2  上市公司数量  为什么要指出这个问题?笔者目前在二线城市,工作10年经历过几家公司,很少有公司把流程制定得很正规和完善。  基本上的形式是:常规瀑布模式和敏捷模式相结合。赶上功能已上线再出现Bug,常见的状态开发快速定位问题进行修改,测试抓紧时间进行测试,测完后上线发布。  所以得出的结论是流程...
            0 0 1758
            分享
          •   最近有工作了一年多的朋友在问我,一个web页面到底怎么测试?我的第一感觉是震惊,天天做web测试,咋还不知道怎么测试呢?再仔细一想,可能是我们每天忙于测试而忽略测试导致的,毕竟当局者迷,旁观者清。  下面就说一下,该从哪些角度测试一个web网站,希望给同样不知所措的你一点提示:  一、UI测试  UI用户界面测试,主要检测前端页面展示效果的,测试关注的点有如下几方面:  1、各页面的风格是否统一  2、各页面的大小是否一致;同样的LOGO图片在各个页面中显示是否大小一致;页面及图片是否居中显示 、各页面的title是否正确  3、栏目名称、文章内容等处的文字是否正确,有错别字或乱码;同一级...
            14 16 2938
            分享
      • 51testing软件测试圈微信