『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)
5、addfinalizer关键字
yield是当用例执行完之后,会执行yield后面的代码,但用例不能有return返回值。
addfinalizer实现功能跟yield一样,但是用例可以return参数,传给后面用例。
示例1:
import pytest
@pytest.fixture()
def login(request): # request是Pytest中的一个关键字,固定写法。
# 步骤1:正常编写前置用例
print("打开APP")
print("输入账号,密码,进行登录")
username = '小明'
# 步骤3:定义用例执行后要执行的代码,封装到一个函数中
def closeApp(): # 这个closeApp函数命是自定义的
print("关闭APP")
# 步骤4:执行上面封装的代码。
# 通过request关键字,结束上面的函数。
request.addfinalizer(closeApp)# 终结函数
# 步骤2:返回参数给测试用例。
# 返回参数可以是变量,对象,表达式,常量值。
return username
def test_add_cart(login): # 步骤3
print("添加购物车--需要登录")
# 这里需要注意: 如果要使用fixture方法返回的数据,
# 就直接填写fixture方法名称。
# 返回参数的名称和可以和fixture方法的名称相同。
print(f"登陆者:{login}")
def test_add_address(login): # 步骤3
print("添加收货地址--需要登录")
print(f"登陆者:{login}")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
test_01.py::test_add_cart 打开APP
输入账号,密码,进行登录
添加购物车--需要登录
登陆者:小明
PASSED关闭APP
test_01.py::test_add_address 打开APP
输入账号,密码,进行登录
添加收货地址--需要登录
登陆者:小明
PASSED关闭APP
"""
示例2:
# 示例一个selenium自动化关闭开启关闭浏览器的操作。
import time
import pytest
from selenium import webdriver
@pytest.fixture()
def driver(request): # request是Pytest中的一个关键字,固定写法。
# 步骤1:创建浏览器驱动对象
driver = webdriver.Firefox()
# 步骤3:定义用例执行后要执行的代码,封装到一个函数中
def end(): # 这个end函数命是自定义的
driver.quit()
# 步骤4:执行上面封装的代码。
# 通过request关键字,结束上面的函数。
request.addfinalizer(end) # 终结函数
# 步骤2:返回浏览器驱动对象,给测试用例
# 返回参数可以是变量,对象,表达式,常量值。
# 返回参数的名称和可以和fixture方法的名称相同。
return driver
def test_baidu(driver):
"""打开百度"""
driver.get("http://www.baidu.com")
time.sleep(3)
def test_163(driver):
"""打开网易"""
driver.get("http://www.163.com")
time.sleep(3)
if __name__ == '__main__':
pytest.main()
示例3:
使用yield也可以返回数据。(这种方式好神奇)
import pytest
@pytest.fixture()
def login(request):
print("打开APP")
print("输入账号,密码,进行登录")
username = '小明'
yield username
print("关闭APP")
def test_add_cart(login): # 步骤3
print("添加购物车--需要登录")
print(f"登陆者:{login}")
def test_add_address(login): # 步骤3
print("添加收货地址--需要登录")
print(f"登陆者:{login}")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
test_01.py::test_add_cart 打开APP
输入账号,密码,进行登录
添加购物车--需要登录
登陆者:小明
PASSED关闭APP
test_01.py::test_add_address 打开APP
输入账号,密码,进行登录
添加收货地址--需要登录
登陆者:小明
PASSED关闭APP
"""
总结:
return和yield都表示返回的意思,但是return的后面不能有代码,yield的后面可以接代码。
6、带返回值的Fixture
上面例子是带返回值并且还要实现teardown()后置函数的Fixture写法。
这里就是单纯的说明带返回值的Fixture。
我们可以选择让Fixture返回我们需要的东西,如果Fixture需要配置一些数据,读个文件,或者连接一个数据库,那么你可以让Fixture返回这些数据或资源。
示例:
"""
1.学习目标
掌握带返回值的fixture
2.操作步骤
2.1 编写带返回值fixture
2.2 使用测试用例调用
3.需求
"""
import pytest
# 编写fixture
@pytest.fixture()
def data():
print("准备好的测试数据")
return 3 # 返回数据
def test_data(data):
print("执行用例步骤")
print(f"得到参数{data}") # 可以使用在用例步骤中
assert data == 3 # 使用在断言中
"""
执行结果:
test_01.py::test_data 准备好的测试数据
执行用例步骤
得到参数3
PASSED
"""
说明:Fixture装饰类中,也可以实现数据的准备。
7、Fixture实现参数化
Fixture修饰的函数可以通过添加params参数来实现参数化。(实际工作中,不常用此方式)
(1)params参数的使用
request代表Fixture的调用状态,request.param作为返回值供测试使用。
示例:
"""
1.学习目标
掌握带参数化fixture编写
2.操作步骤
@pytest.fixture(params=[列表格式数据])
request是pytest中内置关键字
"""
import pytest
# 编写fixture,带参数
data = [666, 888, 1000]
# request会接收到params=data的参数
# 然后request.param(固定写法)每次传递一个参数
@pytest.fixture(params=data)
def need_data(request):
return request.param
def test_data(need_data):
print(f"测试数据:{need_data}")
assert 666 == need_data
if __name__ == '__main__':
pytest.main()
"""
test_01.py::test_data[666] 测试数据:666
PASSED
test_01.py::test_data[888] 测试数据:888
FAILED
test_01.py::test_data[1000] 测试数据:1000
FAILED
"""
说明:上面的例子,通过
assert简单判断下拿到的request.param值,有没有在原来的参数列表中。实际上就相当于遍历了一遍参数列表,们可以看到测试方法被调用了3次。
(2)进阶使用
参数是一个元组列表格式的数据。
"""
1.学习目标
掌握带参数化fixture编写
2.操作步骤
@pytest.fixture(params=[列表格式数据])
request是pytest中内置关键字
3.需求
4.总结
1.pytest fixture 主要是用来完成测试用例执行前后操作
例如:测试前后对数据库连接/断开;打开/关闭浏览器APP
2.fixture还可以用来准备测试数据
带参数fixture
有返回值fixture (在实际工作中返回数据比较灵活,推荐使用)
3.fixture中的参数
scope: 确定fixture作用范围 默认function,class,module,session
autouse:当值true时,相当于setup
name: 对fixture重命名
"""
import pytest
# 编写fixture,带参数
@pytest.fixture(params=[("孙悟空", 666), ("猪八戒", 777), ("沙和尚", 888)])
def need_data(request):
return request.param
def test_data(need_data):
print(f"测试人物:{need_data[0]}")
print(f"测试分数:{need_data[1]}")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
测试人物:孙悟空
测试分数:666
PASSED测试人物:猪八戒
测试分数:777
PASSED测试人物:沙和尚
测试分数:888
PASSED
"""
总结:params参数支持的格式。
- 列表
[]。 - 元组
()。 - 元素列表
[(),(),()]。 - 字典列表
[{},{},{}],提示:只能取{}整体。 - 字典元祖
({},{},{}),提示:只能取{}整体。
8、@pytest.mark.usefixtures()的使用
@pytest.mark.usefixtures("fixturename")装饰类也是一种调用Fixture的方式。
@pytest.mark.usefixtures("fixturename")装饰类可以装饰模块、类、函数、方法。
usefixtures与传fixture区别:
如果Fixture有返回值,则不能用@pytest.mark.usefixtures("fixturename")装饰器修饰用例。
如果Fixture没有返回值,用@pytest.mark.usefixtures("fixturename")装饰器和@pytest.fixture()装饰器作用一样。
示例:
import pytest
# 步骤1
@pytest.fixture()
def login():
print("打开APP")
print("输入账号,密码,进行登录")
yield # 当用例执行完成后,执行yield后的代码
print("关闭APP")
# 方式一:
def test_add_cart(login):
print("添加购物车--需要登录")
# 方式二:就是把fixture方法传入usefixtures装饰器中
@pytest.mark.usefixtures("login")
def test_add_address(): #
print("添加收货地址--需要登录")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
test_01.py::test_add_cart 打开APP
输入账号,密码,进行登录
添加购物车--需要登录
PASSED关闭APP
test_01.py::test_add_address 打开APP
输入账号,密码,进行登录
添加收货地址--需要登录
PASSED关闭APP
"""
『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)的更多相关文章
- 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)
目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...
- 『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)
目录 9.ids参数说明 10.name参数说明 11.scope参数说明 (1)scope="function" (2)scope="class" (3)sc ...
- 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件
目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...
- 『德不孤』Pytest框架 — 15、Pytest参数化
目录 1.Pytest参数化说明 2.Pytest参数化方式 3.parametrize装饰器参数说明 4.Pytest参数化(单个参数) 5.Pytest参数化(多个参数) 6.ids参数说明 1. ...
- Typescript中的装饰器原理
Typescript中的装饰器原理 1.小原理 因为react中的高阶组件本质上是个高阶函数的调用, 所以高阶组件的使用,我们既可以使用函数式方法调用,也可以使用装饰器. 也就是说,装饰器的本质就是一 ...
- Python中的装饰器的简单介绍02
这篇博文转载自伯乐在线的12步轻松搞定python装饰器,重构成python3. 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例 ...
- http://python.jobbole.com/85056/ 简单 12 步理解 Python 装饰器,https://www.cnblogs.com/deeper/p/7482958.html另一篇文章
好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函 ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
随机推荐
- TensorFlow 机器学习秘籍中文第二版·翻译完成
原文:TensorFlow Machine Learning Cookbook 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原则 2.3 ...
- js 斐波那契数列的获取和曲线的实现(每日一更)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- Visual Studio 中快速创建方法 Generate a method in Visual Studio
2020-04-04 https://docs.microsoft.com/en-us/visualstudio/ide/reference/generate-method?view=vs-2019 ...
- 使用IndexedDB缓存给WebGL三维程序加速
前言 使用webgl开发三维应用的时候,经常会发现三维场景加载比较慢,往往需要等待挺长时间,这样用户的体验就很不友好. 造成加载慢的原因,主要是三维应用涉及到的资源文件会特别多,这些资源文件主要是模型 ...
- canvas绘制“飞机大战”小游戏,真香!
canvas是ArkUI开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活.高效等优点,被广泛应用于UI界面开发中. 本期,我们将为大家介绍canvas组件的使用. 一.canvas介绍 1 ...
- Git起始操作之设置全局用户名和Email地址
引自:廖雪峰老师的Git教程 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址.你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无 ...
- Android Adapter基本理解
感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...
- pytest-html 测试报告
前言 上一篇文章pytest简介中,执行测试用例后,在 pycharm 控制台(方式一)或 Terminal(方式二)中可以查看测试结果.但是在实际的接口自动化项目中一般需要生成直观的测试报告,这个测 ...
- 500行代码了解Mecached缓存客户端驱动原理
原创不易,求分享.求一键三连 缓存一般是用来加速数据访问的效率,在获取数据耗时高的场景下使用缓存可以有效的提高数据获取的效率. 比如,先从memcached中获取数据,如果没有则查询mysql中的数据 ...
- java中最简单的计算执行时长的方式
日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.u ...