前言
前面一篇讲了setup、teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的
如果有以下场景:用例 1 需要先登录,用例 2 不需要登录,用例 3 需要先登录。很显然无法用 setup 和 teardown 来实现了fixture可以让我们自定义测试用例的前置条件
fixture优势
- 命名方式灵活,不局限于 setup 和teardown 这几个命名
- conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到fixture
- scope="module" 可以实现多个.py 跨文件共享前置
- scope="session" 以实现多个.py 跨文件使用一个 session 来完成多个用例
fixture参数列表
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
def test():
print("fixture初始化的参数列表")
参数列表
- scope:可以理解成fixture的作用域,默认:function,还有class、module、package、session四个【常用】
- autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture
- name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name
注意
session的作用域:是整个测试会话,即开始执行pytest到结束测试
测试用例如何调用fixture
- 将fixture名称作为测试用例函数的输入参数
- 测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)
- fixture设置autouse=True
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-06 15:50 __Author__ = 小菠萝测试笔记 __Blog__ = https://www.cnblogs.com/poloyy/ """ import pytest # 调用方式一 @pytest.fixture def login(): print("输入账号,密码先登录") def test_s1(login): print("用例 1:登录之后其它动作 111") def test_s2(): # 不传 login print("用例 2:不需要登录,操作 222") # 调用方式二 @pytest.fixture def login2(): print("please输入账号,密码先登录") @pytest.mark.usefixtures("login2", "login") def test_s11(): print("用例 11:登录之后其它动作 111") # 调用方式三 @pytest.fixture(autouse=True) def login3(): print("====auto===") # 不是test开头,加了装饰器也不会执行fixture @pytest.mark.usefixtures("login2") def loginss(): print(123)
执行结果
fixture的实例化顺序
- 较高 scope 范围的fixture(session)在较低 scope 范围的fixture( function 、 class )之前实例化【session > package > module > class > function】
- 具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】
- 自动使用(autouse=True)的fixture将在显式使用(传参或装饰器)的fixture之前实例化
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-06 16:14 __Author__ = 小菠萝测试笔记 __Blog__ = https://www.cnblogs.com/poloyy/ """ import pytest order = [] @pytest.fixture(scope="session") def s1(): order.append("s1") @pytest.fixture(scope="module") def m1(): order.append("m1") @pytest.fixture def f1(f3, a1): # 先实例化f3, 再实例化a1, 最后实例化f1 order.append("f1") assert f3 == 123 @pytest.fixture def f3(): order.append("f3") a = 123 yield a @pytest.fixture def a1(): order.append("a1") @pytest.fixture def f2(): order.append("f2") def test_order(f1, m1, f2, s1): # m1、s1在f1后,但因为scope范围大,所以会优先实例化 assert order == ["s1", "m1", "f3", "a1", "f1", "f2"]
执行结果
断言成功
关于fixture的注意点
添加了 @pytest.fixture
,如果fixture还想依赖其他fixture,需要用函数传参的方式,不能用 @pytest.mark.usefixtures()
的方式,否则会不生效
@pytest.fixture(scope="session") def open(): print("===打开浏览器===") @pytest.fixture # @pytest.mark.usefixtures("open") 不可取!!!不生效!!! def login(open): # 方法级别前置操作setup print(f"输入账号,密码先登录{open}")
前面讲的,其实都是setup的操作,那么现在就来讲下teardown是怎么实现的
用fixture实现teardown并不是一个独立的函数,而是用 yield 关键字来开启teardown操作
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-06 15:50 __Author__ = 小菠萝测试笔记 __Blog__ = https://www.cnblogs.com/poloyy/ """ import pytest @pytest.fixture(scope="session") def open(): # 会话前置操作setup print("===打开浏览器===") test = "测试变量是否返回" yield test # 会话后置操作teardown print("==关闭浏览器==") @pytest.fixture def login(open): # 方法级别前置操作setup print(f"输入账号,密码先登录{open}") name = "==我是账号==" pwd = "==我是密码==" age = "==我是年龄==" # 返回变量 yield name, pwd, age # 方法级别后置操作teardown print("登录成功") def test_s1(login): print("==用例1==") # 返回的是一个元组 print(login) # 分别赋值给不同变量 name, pwd, age = login print(name, pwd, age) assert "账号" in name assert "密码" in pwd assert "年龄" in age def test_s2(login): print("==用例2==") print(login)
yield注意事项
- 如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容
- 如果测试用例抛出异常,yield后面的teardown内容还是会正常执行
yield+with的结合
# 官方例子 @pytest.fixture(scope="module") def smtp_connection(): with smtplib.SMTP("smtp.gmail.com", 587, timeout=5) as smtp_connection: yield smtp_connection # provide the fixture value
该 smtp_connection
连接将测试完成执行后已经关闭,因为 smtp_connection
对象自动关闭时, with
语句结束。
addfinalizer 终结函数
@pytest.fixture(scope="module") def test_addfinalizer(request): # 前置操作setup print("==再次打开浏览器==") test = "test_addfinalizer" def fin(): # 后置操作teardown print("==再次关闭浏览器==") request.addfinalizer(fin) # 返回前置操作的变量 return test def test_anthor(test_addfinalizer): print("==最新用例==", test_addfinalizer)
注意事项
如果 request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer() 的teardown内容(和yield相似,应该是最近新版本改成一致了)
可以声明多个终结函数并调用
总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 完美倒立.2024-夜色碳酸【草台回声】【FLAC分轨】
- 杨青《半山听雨贰HQ》头版限量编号[低速原抓WAV+CUE]
- 白玛多吉《云上西藏1+2》DTS-WAV
- 模拟之声慢刻CD《柏林之声3》[正版CD原抓WAV+CUE]
- 威神V(WayV)《The Highest》[FLAC/分轨][259.1MB]
- 余超颖《迷焕纪》[320K/MP3][201.15MB]
- 余超颖《迷焕纪》[FLAC/分轨][784.22MB]
- 温岚.2005-爱回温新歌加精选2CD【阿尔发】【WAV+CUE】
- 尤雅.1990-台语怀念金曲特选辑【太阳神】【WAV+CUE】
- 群星.2024-七夜雪电视剧影视原声带【听见时代】【FLAC分轨】
- 群星《胎教音乐 古典钢琴曲与水晶摇篮曲》[320K/MP3][134.14MB]
- 群星《胎教音乐 古典钢琴曲与水晶摇篮曲》[FLAC/分轨][654.13MB]
- 许惠钧《睡眠钢琴与校园民歌金曲 空灵新世纪催眠曲》[320K/MP3][201.15MB]
- wbg战队国籍分别都是哪里的 wbg战队2024阵容国籍介绍
- wbg战队教练是韩国人吗 s14wbg战队教练国籍介绍