fixture的作用
fixture在测试函数前后运行,代码可以定制,满足多变的测试需求
功能包括:定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等
fixture是pytest把在测试前后做预备和清理工作的代码,分离出核心逻辑的一种机制
使用场景
用例1需要登录,用例2不需要登录,用例3需要登录,这种场景无法通过setup、teardown实现;要想实现此场景,就用到fixture了
使用方法
调用fixture函数的两种方式:1 把函数当做参数传入 2 用usefixtures
@pytest.fixture()
def login():return "登录" class TestLogin:# 方式一:把fixture函数当做参数传入def test_case1(self, login): print(login)print("需要登录")def test_case2(self):print("不需要登录")# 方式二:用usefixtures调用fixture函数@pytest.mark.usefixtures("login")def test_case3(self):print("需要登录")
若所有用例都需要调用fixture函数,编码比较麻烦,我们可以用pytest.fixture(autouse=True),则模块中所有的用例将自动调用fixture函数
@pytest.fixture(autouse=True)
def login():return "登录" class TestLogin:def test_case(self): print("需要登录")
调用多个fixture函数
@pytest.fixture()
def login1():return "登录1"@pytest.fixture()
def login2():return "登录2"class TestLogin:def test_case1(self, login1, login2):print(login1, login2)
fixture作用域
fixture有个参数scope,通过scope控制fixture的作用范围,作用范围大小依次为session > module > class > function
scope=“function”,函数或方法都会调用,scope默认为function
@pytest.fixture(scope="function")
def login():return "登录"
scope=“class”,类级别调用一次,类似setup_class、teardown_class
# fixture函数使用autouse=True,则以下的测试函数或测试方法不需要传入fixture函数名
@pytest.fixture(scope="class",autouse=True)
def login():return "登录"# fixture函数不使用autouse=True,则测试函数或测试方法需要传入fixture函数名
class TestLogin:def test_case1(self, login):print("case1")def test_case2(self):print("case2")def test_case3(self):print("case3")
scope=“module”,模块级别调用一次,类似setup_module、teardown_module
# fixture函数使用autouse=True,则以下的测试函数或测试方法不需要传入fixture函数名
@pytest.fixture(scope="module",autouse=True)
def login():return "登录"# fixture函数不使用autouse=True,则测试函数或测试方法需要传入fixture函数名
class TestLogin:def test_case1(self, login):print("case1")def test_case2(self):print("case2")def test_case3(self):print("case3")
scope=“session”,多个文件调用一次,可以跨py文件调用;
fixture函数要放conftest.py文件中;
conftest.py用法:
- conftest.py文件名不能更改
- conftest.py与运行的用例放在同一个package下,package下要有__init__.py
- 不需要import导入conftest.py,pytest用例会自动查找
- 相同目录下的测试文件运行前都会执行conftest.py文件
- 不同层级的目录中都有conftest.py,内层的conftest.py中的方法会覆盖外层conftest.py中的方法
- 除了scope="session"的fixture方法可以放在此文件中,其他公共方法(module/class/funciton)都可以放在此文件中,从而使我们的测试用例文件简洁很多
# conftest.py
@pytest.fixture(scope="session")
def login():return "登录"
================================
# test_fixture.py
class TestLogin:def test_case1(self, login):print("case1")def test_case2(self):print("case2")def test_case3(self):print("case3")
yield
使用yield可以实现teardown
@pytest.fixture()
def login():print("登录")yield "同return返回数据,不同的是return后不执行后面的代码;而yield只是暂停,当函数被再次调用时,则会执行yield后面的代码"print("退出登录")
参数化
@pytest.fixture(params=[1, 2, 3])
def login(request):return request.paramclass TestLogin:def test_case(self, login):print(f"{login}")