Hamcrest使用
简介
- Hamcrest支持多种语言,是可以自定义匹配器对象的框架,可以更灵活的定义“匹配”规则,在很多情况下匹配器都是很好用的,比如UI校验、数据过滤,尤其在测试方面进行断言,之前用的最多的就是assert了,Hamcrest使用起来会更加的灵活。下面已python为例进行介绍。
安装
`pip install Pyhamcrest`
示例
from hamcrest import *
import unittest
class HamcrestTest(unittest.TestCase):
def testEquals(self):
theString = 'Hello Hamcrest'
myString = 'Hello Hamcrest'
# assert_that函数是一个用于进行测试断言的方法
assert_that()
assert_that(theString, equal_to(myString))
if __name__ == '__main__':
unittest.main()
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项目的任何序列。
自定义匹配器
- 让我们编写自己的匹配器来测试日期是否是星期六
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)
本文来自博客园,作者:小小滴人a,转载请注明原文链接:https://www.cnblogs.com/xxiaow/p/16397855.html
任何人的成功都无法一蹴而就,每一阶段的抵达,都离不开一步一个脚印的积累。只要不急不躁,耐心努力,保持对新事物的好奇,就是行进在成为更好自己的路上。慢慢来,别着急,生活终将为你备好所有的答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下