『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)
9、ids参数说明
ids参数就是给每一个变量起一个别名。
示例:
import pytest
data = [("孙悟空", 666), ("猪八戒", 777), ("沙和尚", 888)]
# ids参数的个数要与params参数的个数相同,用的很少
@pytest.fixture(params=data, ids=['suk', 'zbj', 'shs'])
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()
"""
之前的测试结果:
test_01.py::test_data[need_data0] 测试人物:孙悟空
测试分数:666
PASSED
test_01.py::test_data[need_data1] 测试人物:猪八戒
测试分数:777
PASSED
test_01.py::test_data[need_data2] 测试人物:沙和尚
测试分数:888
PASSED
加上ids参数后的执行结果:只是[]的内容变化了,这就是ids参数的作用
test_01.py::test_data[suk] 测试人物:孙悟空
测试分数:666
PASSED
test_01.py::test_data[zbj] 测试人物:猪八戒
测试分数:777
PASSED
test_01.py::test_data[shs] 测试人物:沙和尚
测试分数:888
PASSED
"""
10、name参数说明
name参数就是给Fixture修饰的方法起个别名。
示例:
import pytest
data = [("孙悟空", 666), ("猪八戒", 777), ("沙和尚", 888)]
# ids参数的个数要与params参数的个数相同,用的很少
@pytest.fixture(params=data, name="abc")
def need_data(request):
return request.param
# 注意,如果定义了name属性,用例的方法参数就需要传入name属性定义的值。
# 否则将会报错。
# 还有用例中调用参数的使用,也需要使用name定义的别名。
# 即:当取了别名之后,那么原来的方法名就用不了了。
def test_data(abc):
print(f"测试人物:{abc[0]}")
print(f"测试分数:{abc[1]}")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
test_01.py::test_data[abc0] 测试人物:孙悟空
测试分数:666
PASSED
test_01.py::test_data[abc1] 测试人物:猪八戒
测试分数:777
PASSED
test_01.py::test_data[abc2] 测试人物:沙和尚
测试分数:888
PASSED
"""
11、scope参数说明
scope参数有四个级别:function(默认),class,module,session。
作用范围:session > module > class > function
scope="function":@pytest.fixture()装饰器如果不写参数,默认参数就是scope="function"。它的作用范围是,在每个测试用例执行的前(后)运行一次。scope="class":@pytest.fixture()装饰器为class级别的时候,Fixture方法只在此class里所有用例开始执行前(后)执行一次。与class中的function没有关系。scope="module":@pytest.fixture()装饰器为module级别的时候,在一个.py脚本中所有用例开始执行前(后)执行一次。scope="session":@pytest.fixture()装饰器为session级别的时候,是可以跨.py模块调用的,每个.py文件就是module。
(1)scope="function"
import pytest
@pytest.fixture(scope="function")
def login():
print("打开APP")
print("输入账号,密码,进行登录")
yield # 当用例执行完成后,执行yield后的代码
print("关闭APP")
def test_add_cart(login):
print("添加购物车--需要登录")
def test_browser_goods():
print("浏览商品--不需要登录")
if __name__ == '__main__':
pytest.main()
"""
执行结果: 只作用域方法或者函数范围
test_01.py::test_add_cart 打开APP
输入账号,密码,进行登录
添加购物车--需要登录
PASSED关闭APP
test_01.py::test_browser_goods 浏览商品--不需要登录
PASSED
"""
(2)scope="class"
import pytest
@pytest.fixture(scope="class")
def login():
print("\nscope=class 作用域的前置函数\n")
yield # 当用例执行完成后,执行yield后的代码
print("\n\nscope=class 作用域的后置函数")
class Test_Demo:
def test_add_cart(self, login):
print("添加购物车--测试用例")
def test_add_address(self):
print("添加收货地址--测试用例")
if __name__ == '__main__':
pytest.main()
"""
执行结果: 只在测试类开始前后执行了
scope=class 作用域的前置函数
添加购物车--测试用例
PASSED
test_01.py::Test_Demo::test_add_address 添加收货地址--测试用例
PASSED
scope=class 作用域的后置函数
"""
(3)scope="module"
import pytest
@pytest.fixture(scope="module")
def login():
print("\nscope=module 作用域的前置函数\n")
yield # 当用例执行完成后,执行yield后的代码
print("\n\nscope=module 作用域的后置函数")
# 如果该用例不传入fixture方法,该用例会优先与fixture前置执行
def test_browser_goods(login):
print("浏览商品--不需要登录")
class Test_Demo:
def test_add_cart(self, login):
print("添加购物车--测试用例")
def test_add_address(self):
print("添加收货地址--测试用例")
class Test_Demo2:
def test_add_cart(self, login):
print("第2次-添加购物车--测试用例")
def test_add_address(self):
print("第2次-添加收货地址--测试用例")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
说明一下:scope=module时,整个.py模块中fixture只执行一次
scope=module 作用域的前置函数
浏览商品--不需要登录
PASSED
test_01.py::Test_Demo::test_add_cart 添加购物车--测试用例
PASSED
test_01.py::Test_Demo::test_add_address 添加收货地址--测试用例
PASSED
test_01.py::Test_Demo2::test_add_cart 第2次-添加购物车--测试用例
PASSED
test_01.py::Test_Demo2::test_add_address 第2次-添加收货地址--测试用例
PASSED
scope=module 作用域的后置函数
"""
(4)scope="session"
test_01.py文件中的用例。
import pytest
@pytest.fixture(scope="session")
def login():
print("\nscope=session 作用域的前置函数\n")
yield # 当用例执行完成后,执行yield后的代码
print("\n\nscope=session 作用域的后置函数")
# 如果该用例不传入fixture方法,该用例会优先与fixture前置执行
def test_browser_goods(login):
print("浏览商品--不需要登录")
class Test_Demo:
def test_add_cart(self, login):
print("添加购物车--测试用例")
def test_add_address(self):
print("添加收货地址--测试用例")
if __name__ == '__main__':
pytest.main()
test_02.py文件中的用例。
# 如果该用例不传入fixture方法,该用例会优先与fixture前置执行
def test_browser_goods():
print("第2次-浏览商品--不需要登录")
class Test_Demo2:
def test_add_cart(self):
print("第2次-添加购物车--测试用例")
def test_add_address(self):
print("第2次-添加收货地址--测试用例")
all.py文件内容:
import pytest
if __name__ == '__main__':
pytest.main()
"""
执行结果:只在该包内执行一次fixture前后置
scope=session 作用域的前置函数
浏览商品--不需要登录
PASSED
test_01.py::Test_Demo::test_add_cart 添加购物车--测试用例
PASSED
test_01.py::Test_Demo::test_add_address 添加收货地址--测试用例
PASSED
test_02.py::test_browser_goods 第2次-浏览商品--不需要登录
PASSED
test_02.py::Test_Demo2::test_add_cart 第2次-添加购物车--测试用例
PASSED
test_02.py::Test_Demo2::test_add_address 第2次-添加收货地址--测试用例
PASSED
scope=session 作用域的后置函数
"""
说明:
我把
session作用域的Fixture写在了test_01.py文件中,其实应该提取出来写到conftest.py文件中。(后面文章会说明)
all.py文件就是为了执行所有测试用例,pytest.ini文件中配置的模糊匹配查询,这样两个文件中的用例就都能执行到了。这里就是一个练习,写的十分不规范,理解其意思就可以。
12、autouse参数说明
示例:实全部用例的前后置
很简单,只需要把Fixture中的autouse参数设置为True即可。
Fixture装饰器会自动执行作用域范围内的所有用例的前后置。
import pytest
@pytest.fixture(autouse=True)
def login():
print("输入账号,密码,进行登录")
def test_add_cart(): # 不需要传入fixture方法
print("添加购物车--需要登录")
def test_add_address(): # 不需要传入fixture方法
print("添加收货地址--需要登录")
if __name__ == '__main__':
pytest.main()
"""
执行结果:
输入账号,密码,进行登录
添加购物车--需要登录
PASSED输入账号,密码,进行登录
添加收货地址--需要登录
PASSED
"""
『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)的更多相关文章
- 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)
目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...
- 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)
目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...
- 『德不孤』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中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- django ----CBV中加装饰器
CBV中加装饰器 from django import views from django.utils.decorators import method_decorator def login_aut ...
- Python 标准库中的装饰器
题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...
随机推荐
- 使用require.context实现前端工程自动化
require.context是什么 一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多 ...
- AT2699 [ARC081D] Flip and Rectangles
以下是简要题解: 首先思考如何判定一个矩形是否能通过操作变成全黑. 首先从简单而又特殊的 \(2 \times 2\) 的矩形开始,不难发现只要其中黑色数量不为奇数即可. 近一步拓展可以发现,一个矩形 ...
- mac每次打开终端都需要source ~/.bashrc以及~/.bash_profile问题
问题描述 在学习git的时候在~/.bashrc下面配置了git log命令的别名 #用于输出git提交日志 alias git-log='git log --pretty=oneline --all ...
- Spring @Cacheable 缓存不生效的问题
最近在项目中使用了Ehcache缓存,使用方式是用Spring提供的 @Cacheable 注解的方式,这种方式简单.快速.方便,推荐使用. 在使用的过程中,遇到了缓存不生效的情况,经过分析处理,总结 ...
- Python中处理日期时间库的使用方法
常用的库有time.datetime.其中datetime库是对time库的封装,所以使用起来更加便捷.date是指日期时间(年月日)处理,time往往更加细小的单位(小时分秒等)的时间处理. 一.d ...
- 云端iclound使用-陈棚
使用NSmetadataQuery查询文档,增加,删除,编辑 界面设计完成后效果如图: 程序清单:FKDiary.h @interface FKDiary : UIDocument @property ...
- VUE3 之 动态组件 - 这个系列的教程通俗易懂,适合新手
1. 概述 暗示效应告诉我们: 巧妙的暗示会在不知不觉中剥夺我们的判断力,对我们的思维形成一定的影响,造成我们行为的些许改变或者偏差. 例如你的朋友说你脸色不太好,是不是病了,此时,你可能就会感觉浑身 ...
- Ubuntu20.04 PostgreSQL 14 安装配置记录
PostgreSQL 名称来源 It was originally named POSTGRES, referring to its origins as a successor to the Ing ...
- 《PHP程序员面试笔试宝典》——如何应对自己不会回答的问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 在面试的过程中,对面试官提出的问题求职者并不是都能回答出来,计算机技术博大精深,很少有人能对计算机技术的各个分支学科了如 ...
- 02编程语言与python介绍
编程语言分类 机器语言:直接用计算机能理解的二进制指令去编写程序,是直接在控制计算机硬件 优点:运行效率高 缺点:开发效率低 1.开发一个简单的小功能都要哟个到非常多条数的二进制指令 2.二进制指令非 ...