Pytest介绍

Pytest是一个成熟的全功能Python测试工具,可以帮助您编写更好的程序。该pytest框架使编写可读测试变得容易,并且可以扩展以支持应用程序和库的复杂功能测试。pytest需要:Python 3.7+ 或 PyPy3。

Pytest特点

开箱即用.自动发现测试用例简化断言语句,统一为assert丰富的插件架构,超过 800 多个外部插件具有灵活的扩展性和方便的参数化方法

安装&使用

$ pip install  pytest
$ pytest --version
pytest 7.1.2

命名规则&断言

  1. 模块:test_.py 或_test.py。
  2. 函数:test*。
  3. 类:Test*,测试类不能有init函数。
  4. 断言:assert ,支持所有python的布尔表达式

用例执行顺序

  1. 在包含用例的项目根路径下(root-dir)执行:pytest -v
  2. 目录和py文件:按照ascii码排序方式,进行文件递归顺序收集和运行
  3. py文件中:按照代码从上到下
  4. 验证执行顺序:pytest --collect-only

命令行选项


assert 布尔表达式

  • 比较运算符:【>】【<】【<=】【>=】【==】【!=】
    例如:assert actual == expected

  • 身份和成员运算符: 【is】、【is not】、【in】、【not in】
    例如: assert expected in actual

  • 逻辑运算符和布尔函数:【not】【and】【or】【startswith()】
    例如 :assert not expected
    例如 :assert version.startswith(“3.8”)

待测student功能

# ---------------------------------student.py--------------------------------------
# 以字典的形式返回学生的姓名和成绩
def student_score():return {'小明': 99, '小红': 100}# 以列表的形式返回学生的姓名
def student_name():return ['小明', '小红']

编写pass 与fail 用例

# ---------------------------------test_01_pass_fail.py---------------------------
# 这是通过用例
def test_pass():# 期望值expected = 1# 实际值actual = 1# 通过(实际值)跟(预期值)进行相等比较,相等通过,不相等报错assert actual == expected# 这是失败,不通过用例
def test_fail():# 期望值expected = 2# 实际值actual = 3# 通过(实际值)跟(预期值)进行相等比较,相等通过,不相等报错assert actual == expected# ---------------------------------test_02_datatype.py----------------------------
from btest.Day1.student import student_score, student_name# 这是student_score的验证全数据等式用例
def test_student_score():# 期望值expected = {'小红': 100, '小明': 99}# 实际值actual = student_score()# 通过(实际值)跟(预期值)进行相等比较,相等通过,不相等报错assert actual == expected# 这是student_score 的验证部分数据等式用例
# 验证小红是否等于100,是:pass 、否:fail
def test_student_score_other():# 期望值expected = 100# 实际值actual = student_score()['小红']# 通过(实际值)跟(预期值)进行相等比较,相等通过,不相等报错assert actual == expected# 这是student_name 的包含用例:
# 验证小明是否在学生姓名列表中,是:pass(通过), 否:fail(失败)
def test_student_name():# 期望值expected = '小明123123'# 实际值actual = student_name()# 通过判断(预期数据)是否在实际数据中,在:pass,不在:failassert len(actual) == 2assert expected in actual

多断言

# ---------------------------------test_03_many_assert.py-------------------------
# 安装: pip install pytest-assume -i https://pypi.douban.com/simple
from pytest_assume.plugin import assumefrom btest.Day1.student import student_scoredef test_student_score_hard():actual = student_score()with assume: # 实际数据类型是否跟预期数据类型一致。assert isinstance(actual, dict)with assume: # 实际的数据长度是否跟预期长度相同assert len(actual) == 3with assume: # 预期数据是否在实际数据内assert '小红123123' in actualwith assume: # 实际数据是否等于预期数据assert actual['小红'] == 60

自定义异常信息

# ---------------------------------test_04_custom_fail.py-------------------------
import pytest
from pytest_assume.plugin import assumefrom btest.Day1.student import student_namedef test_student_name_hard_custom_fail():actual = student_name()with assume:  # 实际的数据长度是否跟预期长度相同assert len(actual) == 3, \f"实际数据长度:{len(actual)} 与预期数据长度:{3}不相同!!"with assume:  # 预期数据是否在实际数据内assert '小红' in actual, \f"预期数据:{'小红'}没在实际数据中:{actual}!!"if '小乐' not in actual:pytest.fail(f"预期数据:小乐,没有在实际数据{actual}中")

处理异常

# ---------------------------------test_05_exceptions.py--------------------------
import pytestfrom btest.Day1.student import student_score# 通用try/finally 处理用例异常
def test_student_score_error():actual = student_score()try:actual['小红'] = actual['小红'] + '10'except:passfinally:assert '小乐' in actual, "小乐没有在学生成绩表里!!"# pytest用例异常处理
def test_student_score_raise():actual = student_score()with pytest.raises(Exception):  # 更具可读性且不易出错。actual['小红'] = actual['小红'] + '10'# assert '小乐' in actual # 不会执行# 会执行assert '小乐' in actual, \f" 预期数据:小乐,没有在实际数据中{actual}!!"# ---------------------------------test_06_get_error.py---------------------------
"""
1、获取用例的所在的模块、
2、获取用例的名称、
3、获取用例的具体错误信息。
"""import inspect  # 从实时 Python 对象中获取有用的信息import pytest# python-inspect 捕获详细异常信息
def test_inspect_info():# 期望值为 模块名::用例名::错误信息expected = 'test_06_get_error::test_inspect_info::division by zero'with pytest.raises(Exception) as exc_info:c = 2 / 0# 获取错误文本:exc_info.value.args[0]# 如获取错误类型:exc_info.typeerror_info = exc_info.value.args[0]  # 获取用例具体错误信息module_name = inspect.getmodulename(__file__)  # 获取用例所在模块method_name = inspect.stack()[0][3]  # [0][3]获取用例名字,[1][4][0]获取用例名字和参数actual = f"{module_name}::{method_name}::{error_info}"assert actual == expected# Pytest内置功能捕获异常信息
def test_get_raises(request):# 期望值为 模块名::用例名::错误信息expected = 'test_06_get_error::test_get_raises::division by zero'with pytest.raises(Exception) as exc_info:c = 2 / 0error_info = exc_info.value.args[0]module_name = request.module.__name__.split('.')[-1]  # 获取模块 包名.test_06xxxmethod_name = request.function.__name__  # 获取用例名字actual = f"{module_name}::{method_name}::{error_info}"assert actual == expected

数据类

Dataclass这个模块提供了一个类装饰器和一些函数,用于自动添加生成的 special method,例如 init() 和 repr() 到用户定义的类。 它最初描述于 PEP 557 .

对标准库的补充,称为数据类。可以将数据类视为“具有默认值的可变命名元组”

数据类使用普通的类定义语法,你可以自由地使用继承、元类、文档字符串、用户定义的方法、类工厂和其他 Python 类特性.

装饰器: http://www.ztloo.com/2021/11/06/decorators/

Python术语对照社区文档: https://docs.python.org/zh-cn/3/glossary.html?highlight=decorator

special method(特殊方法) :https://docs.python.org/zh-cn/3/glossary.html#term-special-method

PEP 557(Python 增强建议) :https://www.python.org/dev/peps/pep-0557

标准库:https://docs.python.org/zh-cn/3/library/index.html

命名元组: https://docs.python.org/zh-cn/3/library/collections.html?highlight=namedtuple

# ---------------------------------face_to_object.py------------------------------
from dataclasses import asdict, dataclass, astuple, replace# https://docs.python.org/3/library/dataclasses.html?highlight=dataclass#module-dataclasses@dataclass
class GirlFriend:# 节省了__init__函数name: strage: intheight: int = 170  # cmweight: int = 50  # kg@classmethoddef from_dict(cls, d):return GirlFriend(**d)def to_dict(self):return asdict(self)def to_tuple(self):return astuple(self)def update(self, **changes):return replace(self, **changes)if __name__ == '__main__':# 把字典转行成类对象ym_dict = {'name': '杨幂', 'age': 18, 'height': 170, 'weight': 68}ym = GirlFriend.from_dict(ym_dict)print('我是类对象型杨幂', ym)# 把类对象转化成字典ym_dict = ym.to_dict()print('我是字典型杨幂:', ym_dict)# 把类对象转化成元组ym_tuple = ym.to_tuple()print(f'我是元组型杨幂:{ym_tuple}')# 把杨幂修改成刘亦菲lyf = ym.update(name='刘亦菲', age=22)print(f'我是刘亦菲:{lyf}')

自定义辅助断言函数

import pytestfrom btest.Day2.face_to_object import GirlFrienddef assert_identical(gf_1, gf_2):if gf_1.name != gf_2.name:pytest.fail(f"name不匹配. {gf_1.name} != {gf_2.name}")def test_identical():gf_1 = GirlFriend("刘亦菲", 18, 170, 60)gf_2 = GirlFriend("刘亦菲", 18, 170, 60)assert_identical(gf_1, gf_2)

更多案例,更多内容,请点击: https://edu.csdn.net/course/detail/37237

Pytest全栈自动化测试指南-入门相关推荐

  1. Pytest全栈自动化测试指南-夹具入门

    二.夹具 2.1 什么是fixtures 在测试中,fixture为测试 提供了一个定义好的.可靠的和一致的上下文.这可能包括环境(例如配置有已知参数的数据库)或内容(例如数据集). 2.2 使用上的 ...

  2. 【python自动化测试】以pytest为底层的全栈自动化测试框架开发

    以实用为导向,把Pytest 自动化测试框架,用到极致! 所有内容,以视频方式进行持续输出和优化, 更多,更精彩的内容,请点击视频链接: 视频链接 有喜欢和想要学习自动化测试的朋友,或者正在公司正在抓 ...

  3. 花一周时间整理了3.5W字的全栈自动化测试面试题(答案+学习路线)!为了找到好工作,拼了!

    目录 前言: 一.Web自动化测试面试题 二.APPUI自动化测试面试题 三.接口自动化测试面试题 四.全栈自动化测试学习路线图及全栈资料分享 前言: 这篇文章是为大家在网上收集整理的软件测试面试题目 ...

  4. python全栈开发实践入门_Python全栈开发实践入门

    Python全栈开发实践入门 编辑 锁定 讨论 上传视频 <Python全栈开发实践入门>是2017年10月电子工业出版社出版的图书,作者是谢瑛俊. 书 名 Python全栈开发实践入门 ...

  5. 收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!

    Python Web全栈开发入门实战教程教程    大家好,我叫亓官劼(qí guān jié ),这个<Python Web全栈开发入门实战教程教程>是一个零基础的实战教程,手把手带你开 ...

  6. python 3.x 全栈开发从入门到精通_GitHub - cxinping/PythonFullStack: 《Python 3 全栈开发从入门到精通》配套代码...

    <Python 3 全栈开发从入门到精通> 为什么要编写本书? 本书作者均来自开发和教育第一线,具备丰富的实际研发和培训经验.在对学校和企业的培训中,针对学校和企业的实际开发需要,定制了全 ...

  7. python全栈开发实践入门_讲书3分钟丨《Python全栈开发实践入门》 -讲书人 谢瑛俊...

    只需3分钟就能快速了解一本书! 由作(译)者发声讲书,直指新书的特点与主旨. 只需利用碎片化时间,省时省力选到适合自己的好书 音频链接 音频内容 大家好,我是<Python全栈开发实践入门> ...

  8. 十年测试经验的阿里p10讲解python初阶:函数和模块 python全栈自动化测试系类4-2

    还是老规矩,大家可能对凡哥不是很了解这里先和大家来个自我介绍 凡哥我已经有着十二年互联网自动化测试和测试开发工程师,拥有丰富的自动化测试平台及测试开发经验,擅长接口测试.Python自动化全栈,测试开 ...

  9. 【阿里内部教程】python初阶:基础语法 python全栈自动化测试系类

    目录 很多小伙伴可能都没有看过凡哥的视频,所以大家可能对凡哥不是很了解这里先和大家来个自我介绍 凡哥我已经有着十二年互联网自动化测试和测试开发工程师,拥有丰富的自动化测试平台及测试开发经验,擅长接口测 ...

  10. Web3 全栈开发指南

    使用Next.js.Polygon.Solidity.The Graph.IPFS和Hardhat构建全栈Web3应用,本教程有相应视频,在这里. 在这个完整深入的web3教程中,将学习构建全栈web ...

最新文章

  1. 使用Android内部的DownloadProvider下载文件,并获取cache权限 .
  2. c++将int转换成string_Integer与int的区别 (== 与 equal)
  3. Ubuntu 无法应用原保存的显示器配置
  4. 批处理添加允许弹出临时窗口站点
  5. mysql数据库增量_mysql数据库增量同步
  6. JNI 调用 DLL
  7. 物联网|ZETA技术助力远超抄表实现智能化、精细化
  8. MPEG4写为avi文件
  9. python判定串口已连接_python的串口连接
  10. 使用 SetProcessWorkingSetSize 降低程序内存
  11. 777 权限 android,Android linux系统644、755、777权限详解
  12. 【一起入门DeepLearning】中科院深度学习第五课:正则化「Regularization」和优化「Optimization」
  13. 由零开始学习小程序架构
  14. 解决电脑插耳机声音外放
  15. sourceinsight 的好处_代码阅读神器——Sourceinsight
  16. 帆软初级证书 第二部分 数知鸟 答案
  17. shell学习整理笔记
  18. 精通C++,该如何学? 网友:船长一语中的啊。。。
  19. blog群发王(价值1980元)源代码提供 1
  20. 非常道-中小软件公司项目管理(3.1 性格测试)

热门文章

  1. 操作系统文件保护及文件共享
  2. python爬虫兼职群-经典古言小说推荐完本
  3. 关于内存溢出遇到的两种情况
  4. Photoshop制作3D水晶按钮
  5. 造成笔记本电池损耗的主要原因
  6. 全网疯传,谷歌BAT员工「LeetCode刷题手册」,1400+超详细算法题讲解。
  7. 柔宇科技奔赴上市为哪般?自称“销售规模较小”,合计亏超30亿
  8. Redis | 哨兵模式-Sentinel
  9. 钉钉机器人关键字自动回复_【原创新软件】办公引流机器人个人微信企业微信QQ通用的自动回复,群发助手...
  10. “计算机诺贝尔奖”的首位华人得主姚期智