当前位置: 代码迷 >> 综合 >> pytest.fixture
  详细解决方案

pytest.fixture

热度:64   发布时间:2024-02-25 14:57:04.0

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}")
  相关解决方案