网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
在方法上面加@pytest.fixture(autouse=Ture)
参数化
- 场景:
测试离不开数据,为了数据灵活,一般数据都是通过参数传的
- 解决:
使用fixture中的固定参数request传递
- 步骤:
在fixture中添加@pytest.fixture(params=[1,2,3,‘linda’])
在方法参数写request,方法体里面使用request.param接受参数
@pytest.fixture(params=['hogwarts','joker'])
def demo_params(request):
print(f'用户名为:{request.param}')
return request.param
def test_demo(demo_params):
print(f"数据为:{demo_params}")
- 注意:fixture的参数是params,而调用的时候是request.param,没有s
总结:
- 模拟setup,teardown(一个用例可以引用多个fixture)
- yield的用法
- 作用域(session,module,类级别,方法级别)
- 自动执行(autouse参数)
- conftest.py用法,一般会把fixture写在conftest.py文件中
- 实现参数化
pytest.ini文件
- pytest.ini是pytest的配置文件
- 可以修改pytest的默认行为
- 不能使用中文符号,包括汉字,空格 ,引号,冒号等
作用:
- 修改用例的命名规则
- 配置日志格式,比代码配置方便很多
- 添加标签,防止运行过程报警告错误
- 指定执行目录
- 排除搜索目录
改变pytest运行规则
[pytest]
;执行check_开头的所有文件
python_files = check_* test_*
;执行所有的以Test和Check开头的类
python_classes = Test* Check*
;执行所有以test_和check_开头的方法
python_functions = check_* test_*
- 注意:win系统的pytest.ini文件不能写中文,注释也不行
pytest配置-添加默认参数
addopts = -v -s --alluredir=./results
指定/忽略执行目录
;设置执行得路径
;testpaths = bilibili baidu
;忽略某些文件夹/目录
norecursedirs = result logs datas test_demo*
插件开发
-
pytest插件分类
- 外部插件:pip install 安装的插件
- 本地插件:pytest自动模块发现机制(conftest.py存放的)
- 内置插件:代码内部的_pytest目录加载(hook函数)
官网:PyPI · The Python Package Index
常用插件
每一种测试框架收集测试用例的顺序是不一样的
pytest执行顺序控制
- 场景:
对于集成测试,经常会有上下文依赖关系的测试用例。如十个步骤,拆分成十个case,这时候能知道到底执行到哪步报错。
用例默认执行顺序:自上而下执行
- 解决:
可以通过setup,teardown和fixture来解决,也可以使用pytest-ordering插件来解决
- 安装:pip install pytest-ordering
- 用法:@pytest.mark.run(order=2)
- 注意:多个插件装饰器(>2)的时候,有可能会发生冲突
并行与分布式并发执行(xdist)
场景1:
- 测试用例1000条,一个用例执行1分钟,一个测试人员需要1000分钟,通常我们会用人力成本换取时间成本,加几个人一起执行,时间就会缩短。这就是一种分布式场景。
场景2:
- 假设有个报名系统,对报名总数进行统计,数据同时进行修改操作的时候有可能出现问题,需要模拟这个场景,需要多用户并发请求数据
解决:
- 使用分布式并发执行测试用例,分布式插件:pytest-xdist
- 安装:pip install pytest-xdist
- 注意:用例多的时候效果明显,多进程并发执行,同时支持allure
hook函数
1. 介绍
- 是个函数,在系统消息触发时被系统调用
- 自动触发机制
- Hook函数的名称是确定的
- pytest有非常多的hook函数
- 使用时直接编写函数体
- 执行是有先后顺序的
- 可以在不同阶段实现不同的功能
pytest执行过程
执行顺序:
pytest编写插件1-修改默认编码
pytest_collection_modifyitems收集上来的测试用例实现定制化功能
解决问题:
- 自定义用例的执行顺序
- 解决编码问题(中文的测试用例名称)
- 自动添加标签
from typing import List
# 修改编码的hook函数
def pytest_collection_modifyitems(
session: "Session", config: "Config", items: List["Item"]
) -> None:
# items里的name是测试用例的名字,nodeid是测试用例的路径
print(items)
for item in items:
# 如果想改变unicode编码格式的话,需要先encode成utf-8格式的,再decode成unicode-escape就可以了
item.name = item.name.encode('utf-8').decode('unicode-escape')
item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')
编写插件2-添加命令行参数
# 定义命令行参数的hook函数
def pytest_addoption(parser):
# group 将下面所有的option都展示在这个group组下
mygroup = parser.getgroup('hogwarts')
mygroup.addoption('--env', # 注册一个命令行选项
default='test', # 参数的默认值
dest='env', # 存储的变量,为属性命令,可以使用option对象访问到这个值
help='set your run env') # 帮助提示,参数的描述信息
@pytest.fixture(scope='session')
def cmd_option(request):
# request获取命令行的参数,config拿到pytest相关配置,getoption拿到命令行参数
return request.config.getoption('--env')
打包发布
打包项目构成:
- 源码包
- setup.py
- 测试包
from setuptools import setup, find_packages
setup(
name='pytest_encode',
url='',
version='1.0', # 版本
author='joker', # 作者
author_email='', # 邮箱
description='set your encoding and logger', # 描述用法
long_description='Show Chinese for you mark.parametrize().', # 完整描述
classifiers=[ # 分类索引,pip所属包的分类,方便在pip官网中搜索
'Framework :: Pytest',
'Programming Language :: Python',
'Topic :: Software Development :: Testing',
'Programming Language :: Python :: 3.8',
],
license='proprietary', # 程序授权信息
packages=find_packages(), # 通过导入的方式发现当前项目下所有的包
keywords=[ # 便于pip进行分类
![img](https://img-blog.csdnimg.cn/img_convert/60789f8c5b61fb5d9341a69f5677fd9d.png)
![img](https://img-blog.csdnimg.cn/img_convert/822eb649d2ae52b0c2493833681a2896.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-rwZ810PC-1715005410350)]
[外链图片转存中...(img-3a0nwwhv-1715005410350)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**