Pytest全栈自动化测试指南-入门
Pytest介绍
Pytest是一个成熟的全功能Python测试工具,可以帮助您编写更好的程序。该pytest框架使编写可读测试变得容易,并且可以扩展以支持应用程序和库的复杂功能测试。pytest需要:Python 3.7+ 或 PyPy3。
Pytest特点
开箱即用.自动发现测试用例简化断言语句,统一为assert丰富的插件架构,超过 800 多个外部插件具有灵活的扩展性和方便的参数化方法
安装&使用
$ pip install pytest
$ pytest --version
pytest 7.1.2
命名规则&断言
- 模块:test_.py 或_test.py。
- 函数:test*。
- 类:Test*,测试类不能有init函数。
- 断言:assert ,支持所有python的布尔表达式
用例执行顺序
- 在包含用例的项目根路径下(root-dir)执行:pytest -v
- 目录和py文件:按照ascii码排序方式,进行文件递归顺序收集和运行
- py文件中:按照代码从上到下
- 验证执行顺序: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全栈自动化测试指南-入门相关推荐
- Pytest全栈自动化测试指南-夹具入门
二.夹具 2.1 什么是fixtures 在测试中,fixture为测试 提供了一个定义好的.可靠的和一致的上下文.这可能包括环境(例如配置有已知参数的数据库)或内容(例如数据集). 2.2 使用上的 ...
- 【python自动化测试】以pytest为底层的全栈自动化测试框架开发
以实用为导向,把Pytest 自动化测试框架,用到极致! 所有内容,以视频方式进行持续输出和优化, 更多,更精彩的内容,请点击视频链接: 视频链接 有喜欢和想要学习自动化测试的朋友,或者正在公司正在抓 ...
- 花一周时间整理了3.5W字的全栈自动化测试面试题(答案+学习路线)!为了找到好工作,拼了!
目录 前言: 一.Web自动化测试面试题 二.APPUI自动化测试面试题 三.接口自动化测试面试题 四.全栈自动化测试学习路线图及全栈资料分享 前言: 这篇文章是为大家在网上收集整理的软件测试面试题目 ...
- python全栈开发实践入门_Python全栈开发实践入门
Python全栈开发实践入门 编辑 锁定 讨论 上传视频 <Python全栈开发实践入门>是2017年10月电子工业出版社出版的图书,作者是谢瑛俊. 书 名 Python全栈开发实践入门 ...
- 收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!
Python Web全栈开发入门实战教程教程 大家好,我叫亓官劼(qí guān jié ),这个<Python Web全栈开发入门实战教程教程>是一个零基础的实战教程,手把手带你开 ...
- python 3.x 全栈开发从入门到精通_GitHub - cxinping/PythonFullStack: 《Python 3 全栈开发从入门到精通》配套代码...
<Python 3 全栈开发从入门到精通> 为什么要编写本书? 本书作者均来自开发和教育第一线,具备丰富的实际研发和培训经验.在对学校和企业的培训中,针对学校和企业的实际开发需要,定制了全 ...
- python全栈开发实践入门_讲书3分钟丨《Python全栈开发实践入门》 -讲书人 谢瑛俊...
只需3分钟就能快速了解一本书! 由作(译)者发声讲书,直指新书的特点与主旨. 只需利用碎片化时间,省时省力选到适合自己的好书 音频链接 音频内容 大家好,我是<Python全栈开发实践入门> ...
- 十年测试经验的阿里p10讲解python初阶:函数和模块 python全栈自动化测试系类4-2
还是老规矩,大家可能对凡哥不是很了解这里先和大家来个自我介绍 凡哥我已经有着十二年互联网自动化测试和测试开发工程师,拥有丰富的自动化测试平台及测试开发经验,擅长接口测试.Python自动化全栈,测试开 ...
- 【阿里内部教程】python初阶:基础语法 python全栈自动化测试系类
目录 很多小伙伴可能都没有看过凡哥的视频,所以大家可能对凡哥不是很了解这里先和大家来个自我介绍 凡哥我已经有着十二年互联网自动化测试和测试开发工程师,拥有丰富的自动化测试平台及测试开发经验,擅长接口测 ...
- Web3 全栈开发指南
使用Next.js.Polygon.Solidity.The Graph.IPFS和Hardhat构建全栈Web3应用,本教程有相应视频,在这里. 在这个完整深入的web3教程中,将学习构建全栈web ...
最新文章
- 使用Android内部的DownloadProvider下载文件,并获取cache权限 .
- c++将int转换成string_Integer与int的区别 (== 与 equal)
- Ubuntu 无法应用原保存的显示器配置
- 批处理添加允许弹出临时窗口站点
- mysql数据库增量_mysql数据库增量同步
- JNI 调用 DLL
- 物联网|ZETA技术助力远超抄表实现智能化、精细化
- MPEG4写为avi文件
- python判定串口已连接_python的串口连接
- 使用 SetProcessWorkingSetSize 降低程序内存
- 777 权限 android,Android linux系统644、755、777权限详解
- 【一起入门DeepLearning】中科院深度学习第五课:正则化「Regularization」和优化「Optimization」
- 由零开始学习小程序架构
- 解决电脑插耳机声音外放
- sourceinsight 的好处_代码阅读神器——Sourceinsight
- 帆软初级证书 第二部分 数知鸟 答案
- shell学习整理笔记
- 精通C++,该如何学? 网友:船长一语中的啊。。。
- blog群发王(价值1980元)源代码提供 1
- 非常道-中小软件公司项目管理(3.1 性格测试)
热门文章
- 操作系统文件保护及文件共享
- python爬虫兼职群-经典古言小说推荐完本
- 关于内存溢出遇到的两种情况
- Photoshop制作3D水晶按钮
- 造成笔记本电池损耗的主要原因
- 全网疯传,谷歌BAT员工「LeetCode刷题手册」,1400+超详细算法题讲解。
- 柔宇科技奔赴上市为哪般?自称“销售规模较小”,合计亏超30亿
- Redis | 哨兵模式-Sentinel
- 钉钉机器人关键字自动回复_【原创新软件】办公引流机器人个人微信企业微信QQ通用的自动回复,群发助手...
- “计算机诺贝尔奖”的首位华人得主姚期智