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的性别信息")

匹配器

对于以上的匹配器,这里就不一一举例,可在实际项目应用中翻看源码api说明或官方文档即可

参考