5:原生 assert 断言

发布时间:2026/6/2 23:50:28

5:原生 assert 断言 上篇讲解 Pytest 类 方法级前后置 setup_class/setup_method本篇聚焦测试核心断言。自动化用例靠断言判定执行结果Pytest 摒弃 unittest 繁琐断言方法直接使用 Python 原生 assert简洁高效是接口、UI 自动化高频用法。一、什么是断言Pytest 选用原生 assert 的优势断言用来校验程序实际结果与预期结果是否一致条件为 True用例通过条件为 False抛出 AssertionError用例失败终止执行。对比 unittestPytest assert 两大优点语法极简不用记忆self.assertEqual、self.assertIn、self.assertTrue等一堆方法直接用原生运算符、、in、is降低学习成本。报错详情自动解析Pytest 底层重写 assert失败自动打印实际值、期望值、变量来源、数据差异不用手动拼接日志排查问题。unittest 冗余示例import unittest class TestDemo(unittest.TestCase): def test_01(self): res 23 self.assertEqual(res,6,结果错误)Pytest 简洁写法def test_01(): res 23 assert res 6, f预期6实际{res}二、assert 基础语法assert 布尔表达式, 自定义失败提示文案可选布尔表达式满足条件 True → 用例放行不满足 False → 断言失败自定义提示失败时优先展示自定义信息便于快速定位业务问题自动化项目必加基础示例# test_assert_base.py def test_assert_demo(): expect 200 actual 200 # 成功无报错 assert actual expect # 失败抛出异常自定义提示 actual2 500 assert actual2 expect, f接口状态码异常预期{expect}实际{actual2}执行pytest -vs test_assert_base.py三、自动化高频场景全类型断言实战接口测试最常用1. 数值断言状态码、数字结果、!、、、、多用于接口响应码、返回数值校验def test_num_assert(): code 200 # 等于 assert code 200, 请求成功状态码必须200 # 大于 assert code 100 # 不等于 assert code ! 5002. 字符串断言返回文本、错误信息in / not in、校验返回内容是否包含指定关键字def test_str_assert(): res_text login success assert success in res_text, 登录返回结果不含success assert fail not in res_text3. 列表 / 元组断言批量返回数据长度、成员存在性校验def test_list_assert(): data_list [10,20,30] # 判断长度 assert len(data_list) 3, 返回数据条数错误 # 判断元素存在 assert 20 in data_list4. 字典断言接口返回 JSON接口自动化重中之重键存在、键值匹配90% 接口用例都会用到def test_dict_assert(): resp {code:200,msg:ok,data:{uid:1001}} # 校验key是否存在 assert code in resp # 校验value assert resp[code] 200 # 嵌套字典取值断言 assert resp[data][uid] 10015. 布尔值断言def test_bool_assert(): flag True assert flag is True四、pytest.raises 异常断言预判代码抛出指定异常部分用例需要校验错误入参是否抛出预期异常不用 try-except 捕获使用with pytest.raises(异常类型)实现异常匹配则用例通过未抛异常则失败。基础用法import pytest def test_exception(): # 预期传入非数字字符串触发ValueError with pytest.raises(ValueError): int(abc123)进阶捕获异常信息def test_exception_msg(): with pytest.raises(ValueError) as err_info: int(test) # 断言异常描述包含指定内容 assert invalid literal for int() in str(err_info.value)五、自定义报错信息规范项目实战最佳实践不要只写assert xxx xx,断言失败模糊提示规范格式assert 条件, f【业务场景】预期XX实际XX# 规范写法 resp_code 404 expect_code 200 assert resp_code expect_code, f【用户登录接口】状态码异常预期{expect_code}实际{resp_code}好处流水线报错一眼定位接口与问题节省排查时间。六、Pytest 自动优化复杂数据断言差异化报错原生 Pytest 对长字符串、字典、列表会自动对比差异字符串不一致高亮不同字符位置字典不一致标出 key 和 value 差异列表不一致提示第一个不匹配下标 示例报错E assert {code: 200, msg: ok} {code: 500, msg: fail} E Differing items: E {code: 200 ! 500, msg: ok ! fail}七、开发踩坑注意事项不要在 assert 表达式中写业务逻辑Python 使用python -O运行时会全局禁用所有 assert表达式内代码不会执行只做结果判断。# 错误删除数据写在断言里-O执行时代码失效 assert del_data() True # 正确逻辑前置只断言结果 res del_data() assert res True自定义提示要用 f-string 动态拼接实际值固定文案无排查意义。八、前后置 断言综合实战整合上篇知识点类前置统一初始化请求、方法前置单用例准备数据最后用断言校验结果企业标准用例模板class TestLoginApi: def setup_class(self): print(【类前置】初始化请求头、全局url) self.headers {Content-Type:application/json} def setup_method(self): print(【方法前置】准备账号数据) self.account {user:test01,pwd:123456} def test_login_success(self): # 模拟接口返回 resp {code:200,msg:登录成功} # 多层断言 assert resp[code] 200, f登录失败状态码{resp[code]} assert 成功 in resp[msg]

相关新闻