fixture通过装饰函数,使函数名可以作为变量传递给测试用例,最终在执行测试用例之前执行这个装饰过的函数。可以替代unittest里面的setup和teardown。
@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)
参数使用说明:
scope:用于控制fixture的作用范围,默认为function。
- function函数级 每一个函数或方法都会调用
- class 类级别 每个测试类只运行一次
- module 模块级 每一个.py文件调用一次
- session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法
排序为:session > module > class > function
params:可选参数列表,默认为None。在执行用例时会循环调用parame内的参数。使用时必须使用request.parame的写法。
ids:配合和参数化一起使用,给用例分配id,用来描述测试用例的标题。
name:给fixture装饰的函数使用别名。
使用举例:
@pytest.fixture()
import pytest
#
@pytest.fixture()
def login():
print("执行登录操作")
class Testlogin():
def test_01(self, login):
print("用例一")
def test_02(self, login):
print("用例二")
if __name__ == '__main__':
pytest.main(['-s', 'testdemo.py'])
# 输出为
>>>testdemo.py 执行登录操作
用例一
.执行登录操作
用例二
fixture的默认作用域为function,可以看出此时被fixture装饰的函数作为参数被引用时,会在执行函数前执行被装饰的函数。
@pytest.fixture(scope='class')
作用域函数,在整个函数内调用且只调用一次。
import pytest
@pytest.fixture(scope='class')
def login():
print("执行登录操作")
class Testlogin():
def test_01(self, login):
print("用例一")
def test_02(self, login):
print("用例二")
if __name__ == '__main__':
pytest.main(['-s', 'testdemo.py'])
# 输出
>>>testdemo.py 执行登录操作
用例一
.用例二
.
当scope的作用域为class时,当类里第一个test_01使用用fixture装饰的函数为参数login前调用一次,之后的test_02再次调用时未执行login函数
@pytest.fixture(scope='module')
整个模块调用且只调用一次
import pytest
@pytest.fixture(scope='module')
def login():
print("执行登录操作")
def test_first(login):
print('调用第一次')
class Testlogin():
def test_01(self, login):
print("用例一")
def test_02(self, login):
print("用例二")
if __name__ == '__main__':
pytest.main(['-s', 'testdemo.py'])
# 输出
>>>testdemo.py 执行登录操作
调用第一次
.用例一
.用例二
当作用域为module时,可以看出在test_firsrt第一次调用前调用了fixture装饰的login函数,在之后再次使用login参数时未调用login函数
@pytest.fixture(scope='session')
跨多个.py文件,若多个模块调用也只允许一次。结合conftest.py使用。pytest会自动识别conftest.py文件。
conftest.py代码
conftest.py
import pytest
@pytest.fixture(scope='session')
def login():
print("执行登录操作")
在文件test_demo.py 和 test_demo2.py 两个文件内使用login参数,文件与conftest.py在一个包内。
test_demo.py
import pytest
def test_01(login):
print('用例一')
test_demo2.py
import pytest
def test_02(login):
print("用例二")
>>> pytest -s
test_demo.py 执行登录操作
用例一
.
test_demo2.py 用例二
.
可以看出当scope='session'时,两个文件内只调用了一次login函数
@pytest.fixture(name='login_name')
使用name时,使用设置的别名login_name作为参数,而且此时再使用login作为参数会报错。
import pytest
@pytest.fixture(name='login_name')
def login():
print('登录')
class Testlogin():
def test_01(self, login_name):
print("用例一")
@pytest.fixture(params=['参数1', '参数2'], ids=["id-01", "id-02"])
使用params时,必须使用request.param获取参数。
ids可以结合params使用,给每一个params'指定一个id,这个id会变成用例的一部分。
import pytest
@pytest.fixture(params=['参数1', '参数2'], ids=["id-01", "id-02"])
def testdemo(request):
return request.param
class Testlogin():
def test_01(self, testdemo):
print(testdemo)
>>>pytest -vs
test_demo.py::Testlogin::test_01[id-01] 参数1
PASSED
test_demo.py::Testlogin::test_01[id-02] 参数2
PASSED
网友评论