一、fixture是什么
fixture是pytest用于将测试前后进行预备、清理工作的代码处理机制。
相较于setup和teardown而言,有以下几点优势:
- fixture命名更加灵活,局限性较小
- conftest.py配置里面可以实现数据共享,不需要import就能自动找到一些配置
二、fixture的scope
- (scope=“function”) 每一个函数或方法都会调用,默认就是function
@pytest.fixture(scope='function')
def func1():
print("function级别的前置操作:func1")
def test_one(func1):
expect = 1
actual = 1
assert expect == actua
执行后,在用例调用前会执行fixture里的操作:
- (scope=“class”) 每一个类调用一次
# 示例:1、先定义一个fixture。这个fixture的函数不需要test_开头命名
import pytest
@pytest.fixture(scope='class', autouse=True)
def func2():
print('class 级别的前置操作:func2')
# 2、在用例里调用这个fixture
class TestClassFixture:
def test_one(self):
expect = 1
actual = 1
print('ok')
assert actual == expect
def test_two(self):
expect = 1
actual = 1
assert actual == expect
虽然类中有2个方法,但fixture的scope是class,因此只执行一次。
- (scope=“module”) 每一个.py文件调用一次
# 示例:1、先定义一个fixture。scope为module
import pytest
@pytest.fixture(scope='module', autouse=True)
def f_module():
print('module级别的前置操作。')
# 2、py文件中定义一个class一个函数
class TestClassFixture:
def test_one(self):
expect = 1
actual = 1
print('ok')
assert actual == expect
def test_two(self):
expect = 1
actual = 1
assert actual == expect
def test_three(self):
expect = 1
actual = 1
assert actual != expect
可以看到,虽然.py文件下存在一个类和一个函数。但只执行了一次前置操作
- (scope=“session”) 是多个文件调用一次
文件结构:
一级目录(根目录): Pytest_session
二级目录: scriptes
三级目录: test_demo01.py
def test_demo01(login):
print("scripts包内的第一个测试用例")
三级目录: test_demo02.py
def test_demo02(login):
print("scripts包内的第二个测试用例")
二级目录: tests
三级目录: test_demo01.py
def test_demo01(login):
print("tests包内的第一个测试用例")
三级目录: test_demo02.py
def test_demo02(login):
print("tests包内的第二个测试用例")
二级目录:conftest.py
import pytest
@pytest.fixture(scope="session")
# @pytest.fixture(scope="module")
def login():
print("正在登陆")
return "login"
二级目录:test_demo.py
def test_demo(login):
print("包外的测试用例")
- 运行结果:
- 结果分析
通过上述结果,可以看到整个测试周期,login只运行一次,所以session的作用域范围是最大的,且是整个测试周期只会运行一次的