4. Pytest自定义前置后置:fixture简单应用
一、前言
前面讲到用例加 setup 和 teardown 可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现指定某一个执行前置,另一个不执行前置,则需要自定义测试用例的预置条件。
二、学习目标
1.conftest.py文件介绍
2.fixture的简单应用
3.fixture前置传参
三、知识点
1.conftest.py文件介绍
fixture实际应用需要结合conftest.py文件来使用,我们将前置函数写在conftest.py中,可以跨文件调用前置。conftest.py是fixture函数的一个集合,可以理解为公共的提取出来放在一个文件里,然后供其它模块调用。不同于普通被调用的模块,conftest.py使用时不需要导入,Pytest会自动查找
-
conftest.py特点:
(一)文件名必须是conftest.py,不得改变。
(二)不需要import导入 conftest.py,pytest用例会自动识别该文件。
(三)放到项目的根目录下就可以全局目录调用,放在某个文件夹下则只能在文件夹内的测试用例调用。
-
conftest.py的使用场景
(一)接口自动化公用的session或token
(二)web自动化时driver实例化操作
2.【fixture的简单应用】
-
语法:
@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)
-
参数说明:
fixture里面有个scope参数可以控制fixture的作用范围,scope:有四个级别参数"function"(默认),"class","module","session
params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
autouse:如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture
ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
name:fixture的名称。这默认为装饰函数的名称 -
代码示例:
#conftest.py文件 import pytest @pytest.fixture(scope="function") def init_function1(): print("用例前置1") yield print("用例后置1") @pytest.fixture(scope="function") def init_function2(): print("用例前置2") yield print("用例后置2") @pytest.fixture(scope="function") def init_function3(): print("用例前置3") yield print("用例后置3")
#测试用例文件test_XXX.py import pytest class TestCase(): def test_case_01(self): num = 1 + 1 print("打印计算结果:{}".format(num)) assert num == 2 @pytest.mark.usefixtures('init_function1')#调用前置 def test_case_02(self): num = 1 + 2 print("打印计算结果:{}".format(num)) assert num == 3 def test_case_03(self,init_function1): #也可以用传参方式调用 num = 1 + 3 print("打印计算结果:{}".format(num)) assert num == 4 @pytest.mark.usefixtures('init_function3')#调用前置 @pytest.mark.usefixtures('init_function1','init_function2')#调用前置 def test_case_03(self): #usefixtures可以传多个前置,也可以叠加(最近的先执行) num = 1 + 4 print("打印计算结果:{}".format(num)) assert num == 5
说明:conftest.py文件定义前置函数,在测试用例方法调用,调用方式有两种,一种是直接往用例方法中传如前置函数的函数名;一种是通过usefixtures调用,这种方式可以传多个前置,也可以叠加调用前置(遵循就近原则执行前置)。
3.【fixture前置传参】
当前置操作中产生的返回值需要被用例使用,需要用到前置传参。如在web自动化中可以将driver浏览器对象写入前置并传入测试用例中使用。我们在定义前置函数时可以用yield关键字返回参数,供测试用例方法使用。
conftest.py文件:
@pytest.fixture(scope="function")
def init_function():
print("用例前置")
a = '这是一个前置参数'
yield a
print("用例后置")
测试用例文件:
def test_case_03(self,init_function): #传入前置函数的方法名
num = 1 + 2
print("打印前置传参结果:{}".format(init_function)) #方法名init_function就是yield返回的a参数
assert num == 3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix