Fixture的调用方式:
@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)
参数详解:
1、SCOPE:
取值 | 范围 | 说明 |
---|---|---|
function | 函数级 | 每一个函数或方法都会调用 |
class | 类级别 | 每个测试类只运行一次 |
module | 模块级 | 每一个.py文件调用一次 |
session | 会话级 | 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法 |
作用范围举例:
scope = "function"
语法:
@pytest.fixture()
#或者
@pytest.fixture(scope='function')
场景一:做为参数传入
# -*- coding:utf-8 -*-
'''
@Author : 测试工程师Jane
@FileName : d.py
@Description:
'''
import pytest
# fixture函数(类中) 作为多个参数传入
@pytest.fixture()
def login():
print("打开浏览器")
a = "account"
return a
@pytest.fixture()
def logout():
print("关闭浏览器")
class TestLogin:
#传入lonin fixture
def test_001(self, login):
print("001传入了loging fixture")
assert login == "account"
#传入logout fixture
def test_002(self, logout):
print("002传入了logout fixture")
def test_003(self, login, logout):
print("003传入了两个fixture")
def test_004(self):
print("004未传入仍何fixture哦")
if __name__ == '__main__':
pytest.main()
运行结果:
从运行结果可以看出,fixture做为参数传入时,会在执行函数之前执行该fixture函数。再将值传入测试函数做为参数使用,这个场景多用于登录
场景二、Fixture的相互调用
代码:
# -*- coding:utf-8 -*-
'''
@Author : 测试工程师Jane
@FileName : e.py
@Description:
'''
import pytest
# fixtrue作为参数,互相调用传入
@pytest.fixture()
def account():
a = "account"
print("第一层fixture")
return a
#Fixture的相互调用一定是要在测试类里调用这层fixture才会生次,普通函数单独调用是不生效的
@pytest.fixture()
def login(account):
print("第二层fixture")
class TestLogin:
def test_1(self, login):
print("直接使用第二层fixture,返回值为{}".format(login))
def test_2(self, account):
print("只调用account fixture,返回值为{}".format(account))
if __name__ == '__main__':
pytest.main()
运行结果:
注:
1.即使fixture之间支持相互调用,但普通函数直接使用fixture是不支持的,一定是在测试函数内调用才会逐级调用生效
2.有多层fixture调用时,最先执行的是最后一层fixture,而不是先执行传入测试函数的fixture
3.上层fixture的值不会自动return,这里就类似函数相互调用一样的逻辑
scope = “class”:
语法:
@pytest.fixture(scope='class')
场景一、
# -*- coding:utf-8 -*-
'''
@Time : 2020/12/28 19:56
@Author : 测试工程师Jane
@FileName : g.py
@Description:
'''
import pytest
# fixture作用域 scope = 'class'
@pytest.fixture(scope='class')
def login():
print("scope为class")
class TestLogin:
def test_1(self, login):
print("用例1")
def test_2(self, login):
print("用例2")
def test_3(self, login):
print("用例3")
if __name__ == '__main__':
pytest.main()
# -*- coding:utf-8 -*-
'''
@Author : 测试工程师Jane
@FileName : 1.py
@Description:
'''
import pytest
@pytest.fixture(scope='class')
def login():
a = '123'
print("输入账号密码登陆")
class TestLogin:
def test_1(self):
print("用例1")
def test_2(self, login):
print("用例2")
def test_3(self, login):
print("用例3")
def test_4(self):
print("用例4")
if __name__ == '__main__':
pytest.main()
运行结果:
scope = “module”:与class相同,只从.py文件开始引用fixture的位置生效
# -*- coding:utf-8 -*-
'''
@Author : 测试工程师Jane
@FileName : 2.py
@Description:
'''
import pytest
# fixture scope = 'module'
@pytest.fixture(scope='module')
def login():
print("fixture范围为module")
def test_01():
print("用例01")
def test_02(login):
print("用例02")
class TestLogin():
def test_1(self):
print("用例1")
def test_2(self):
print("用例2")
def test_3(self):
print("用例3")
if __name__ == '__main__':
pytest.main()
运行结果:
scope = “session”:用法将在conftest.py文章内详细介绍
2、params:
5、Name:
# -*- coding:utf-8 -*-
'''
@Author : 测试工程师Jane
@FileName : nametest.py
'''
import pytest
@pytest.fixture(name="new_fixture")
def test_name():
pass
#使用name参数后,传入重命名函数,执行成功
def test_1(new_fixture):
print("使用name参数后,传入重命名函数,执行成功")
#使用name参数后,仍传入函数名称,会失败
def test_2(test_name):
print("使用name参数后,仍传入函数名称,会失败")
以上为Fixture的部分使用详解,纯属个人理解,有部分内容参考此篇博文,感谢大佬的分享https://www.cnblogs.com/liudinglong/p/12885632.html
转载请注明出处