PyHamcrest在自动化测试中的数据校验应用
概述
python 的断言assert 或 pytest中的断言(可参看Asserting with the assert statement - pytest)在实际的开发中,一些简单的断言基本可以满足。但对于复杂的数据,有时候要进行大段的字段获取再断言,或者干脆自己编写表达式并断言其结果。在开源自动化测试的框架中,如airtest、httprunner都自定义了自己的断言方法,以应对复杂的数据校验
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活
Hamcrest 提供了大量被称为“匹配器”的方法。其中每个匹配器都设计用于执行特定的比较操作。Hamcrest的可扩展性很好,让你能够创建自定义的匹配器。最重要的是,JUnit也包含了Hamcrest的核心,提供了对Hamcrest的原生支持,可以直接使用Hamcrest。当然要使用功能齐备的Hamcrest,还是要引入对它的依赖
Hamcrest支持的语言:Java、Python、Ruby、Objective-C、PHP、Erlang、Swift、Rust、JavaScript (JsHamcrest)、JavaScript (Hamjest)、GO (Gocrest)
hamcrest相关文档
接下来,我们主要来看看PyHamcrest
PyHamcrest
assert_that(actual, matcher=None, reason="")
- actual:实际结果
- matcher:匹配器,匹配期望的结果
- reason(可选):校验失败后的输出信息
- assert_that 也可用于bool值的校验
- 如果断言失败则抛出
AssertionError
简单使用示例
from hamcrest import *
jerry_info = {"name": "jerry", "age": 18}
class TestHamcrest:
def test_age(self):
assert_that(jerry_info.get("age"), greater_than(18), "jerry的年龄是否大于18")
def test_name(self):
assert_that(jerry_info.get("name"), equal_to("jerry"), "jerry的名字")
def test_true(self):
assert_that(jerry_info.get("name"), "jerry的名字是否为空(True)")
def test_false(self):
assert_that(jerry_info.get("sex"), "是否能获取到jerry的性别信息")
匹配器
-
对象
equal_to
- 匹配相等的对象has_length
- 匹配长度len(item)
has_property
- 匹配属性值has_properties
- 匹配包含所有属性值的对象has_string
- 匹配字符串str(item)
instance_of
- 匹配对象的类型none
,not_none
- 匹配None或not Nonesame_instance
- 匹配相同的对象calling
,raises
- calling和raise结合使用
-
数字
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
- 匹配完整的字符串且忽略空白字符starts_with
- 匹配以字符串开始string_contains_in_order
- 在相对位置,匹配部分字符如string_contains_in_order("bc", "fg", "jkl")
将会匹配abcdefghijklm
-
逻辑
-
序列
contains_exactly
- 匹配完整的序列,排序也要一致contains_inanyorder
- 匹配完整的序列,不要求排序一致has_item
- 匹配序列中指定的元素has_items
- 匹配序列中指定的多个元素,不要求排序is_in
- 匹配元素是否在指定序列中only_contains
- 匹配序列是否在指定list中出现empty
- 匹配空序列
-
字典
has_entries
- 匹配字典多个键值对has_entry
- 匹配字典键值对has_key
- 匹配字典的keyhas_value
- 匹配字典的value
对于以上的匹配器,这里就不一一举例,可在实际项目应用中翻看源码api说明或官方文档即可