zoukankan      html  css  js  c++  java
  • Python中Hamcrest断言的使用

    转自:https://blog.csdn.net/dou_being/article/details/105344001

    我们通常熟悉的断言是assert()系列的断言,但有的时候也不能满足我们的需求,所以有了更强大的断言Hamcrest。

    一、Hamcrest简介

    Hamcrest源于Java,支持多种语言,是用于编写匹配器对象的框架,可以更灵活的定义“匹配”规则。Hamcrest 断言,基于更灵活的 Matchers 断言方式。

    二、Hamcrest安装

    可以使用常用的python打包工具来安装Hamcrest,也可以在pycharm中安装,下面以在pycharm中安装为例。

    1.打开pycharm--》Preferences--》Project Interpreter 

    2.在搜索框中搜索“hamcrest”,选择第一个“PyHamcrest”,然后点击安装。

    三、Hamcrest示例Demo


    from hamcrest import *
    import unittest


    class HamcrestTest(unittest.TestCase):
    def testEquals(self):
    theString = 'Hello Hamcrest'
    myString = 'Hello Hamcrest'
    assert_that(theString, equal_to(myString))


    if __name__ == '__main__':
    unittest.main()
     

    关于Hamcrest断言的更多使用,可以参考官网文档:https://github.com/hamcrest/PyHamcrest。

    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项目的任何序列。

    复制代码
    from hamcrest import *
    
    #数字类型
    print(0.1*0.1)   #0.010000000000000002
    print(assert_that(0.1 * 0.1, close_to(0.01,0.000000000000001)))  #close_to(预期比较的值,数字所对应的值之间最大差值被认为是接近的)
    print(assert_that(0.1 * 0.1, greater_than(0.01))) #大于
    print(assert_that(0.1 * 0.1, greater_than_or_equal_to(0.01)))  #大于或等于
    print(assert_that(0.1 * 0.1, less_than(0.02))) #小于
    print(assert_that(0.1 * 0.1, less_than_or_equal_to(0.02)))  #小于或等于
    
    #逻辑
    print('***********逻辑*********')
    print(assert_that(["a", "b", "c"],all_of(has_items("b", "a"),has_items("c", "a")))) #如果所有匹配器都匹配才匹配,匹配上
    print(assert_that(["a", "b", "c"],any_of(has_items("d", "a"),has_items("c", "a")))) #有一个匹配上,就是匹配上
    print(assert_that(["a", "b", "c"],is_not("a")))  #如果包装的匹配器不匹配器时匹配,反之亦然
    print(assert_that(["a", "b", "c"],is_not(equal_to("a")))) #如果包装的匹配器不匹配器时匹配,反之亦然
    print(assert_that(["a", "b", "c"],not_(["a", "b"])))  #如果包装的匹配器不匹配器时匹配,反之亦然
    print(assert_that(["a", "b", "c"],anything(1)))  #匹配任何东西,如果不关心特定值则在复合匹配器中很有用

    返回结果:

    0.010000000000000002
    None
    None
    None
    None
    None
    ***********逻辑*********
    None
    None
    None
    None
    None
    None

     
    复制代码
  • 相关阅读:
    CF1552 D. Array Differentiation
    CF1542 B. Plus and Multiply
    CF1543 D1. RPD and Rap Sheet (Easy Version)
    CF1555 E. Boring Segments(线段树+双指针)
    CF1513 D. GCD and MST
    hdu 6194 string string string
    CF1527 B2. Palindrome Game (hard version)
    DDD领域驱动设计落地实践(十分钟看完,半小时落地)
    【5分钟】W10 64bit系统本地安装postgresql 11
    程序员如何成为架构师
  • 原文地址:https://www.cnblogs.com/jaigejiayou/p/15761777.html
Copyright © 2011-2022 走看看