fixture特性
夹具是在测试中用于提供共享资源、设置测试环境或模拟行为的工具。
1. 可以重复使用,多个用例可以使用同一个fixture
2. 一个测试用例可以使用多个装置
python
import pytest
# Arrange
@pytest.fixture
def first_entry():
return "a"
# Arrange
@pytest.fixture
def second_entry():
return 2
# Arrange
@pytest.fixture
def order(first_entry, second_entry):
return [first_entry, second_entry]
2.1 如果多个装置存在yield,则是先进后出
python
import pytest
@pytest.fixture
def a():
print("hello")
yield
print("this is a")
@pytest.fixture
def b():
print("world")
yield
print("this is b")
def test_demo(a, b):
print("this is test_demo")
if __name__ == '__main__':
pytest.main(["-sv", "test1.py"])
3. fixture的返回值不需要接收
- 如果一个fixture存在返回值,那么可以通过
函数名
直接使用其返回值
,如下所示:
python
import pytest
@pytest.fixture
def first_entry():
return "a"
def test_a(first_entry):
print(first_entry)
if __name__ == '__main__':
pytest.main(["-sv","test1.py"])
4. fixfure多重嵌套
- 如下
append_first
、test_string_only
并且此fixture缓存即order,根据gpt即我的测试
如果一个 fixture 被请求了多次,但它的作用范围是函数级别(默认),那么这个 fixture 在每次请求时都会重新执行一次,而不会缓存。这会导致每次请求获得的数据都是独立的,不受前一次请求的影响。
所以一般不要使用缓存,保证起独立性
python
import pytest
# Arrange
@pytest.fixture
def first_entry():
return "a"
# Arrange
@pytest.fixture
def order():
return []
# Act
@pytest.fixture
def append_first(order, first_entry):
order.append(first_entry)
return order
def test_string_only(append_first, order, first_entry):
# Assert
print(append_first) # ['a']
print(order) ['a']
assert order == [first_entry]
pytest.main(["-sv", "test1.py"])
5自动使用fixture,不需要请求
- 设置和清理环境、全局配置,例如数据库连接、日志设置等可以使用,笔者用的不多
python
import pytest
@pytest.fixture
def first_entry():
return "a"
@pytest.fixture(autouse=True)
def order():
return "hello world"
def test_a(order):
print(order)
pytest.main(["-sv", "test1.py"])