pytest最大的優點之一就是它非常靈活,
它可以將復雜的測驗需求簡化為更簡單和有組織的函式,然后這些函式可以根據自身的需求去依賴別的函式,
fixtures可以呼叫別的fixtures正是靈活性的體現之一,
一、Fixtures呼叫別的Fixtures
直接看一個簡單示例:
import pytest
# Arrange
@pytest.fixture
def first_entry():
# 這是一個fixture函式,回傳值:"a"
return "a"
# Arrange
@pytest.fixture
def order(first_entry):
# 這是另一個fixture函式,請求了上一個fixture函式first_entry(),
# 并且把first_entry()的回傳值,放進了串列[]里,最后回傳
return [first_entry]
def test_string(order):
# Act
# 測驗函式中請求了第二個fixture函式order,可以拿到回傳的[]
order.append("b")
# Assert
assert order == ["a", "b"]
可以看到,pytest中的某個fixture請求別的fixture,就像測驗函式請求fixture一樣,所有的請求規則都適用,
同樣,如果這些事情換我們自己來做的話,應該是下面這樣子:
def first_entry():
return "a"
def order(first_entry):
return [first_entry]
def test_string(order):
# Act
order.append("b")
# Assert
assert order == ["a", "b"]
entry = first_entry()
the_list = order(first_entry=entry)
test_string(order=the_list)
二、Fixtures的復用性
pytest中的fixtures還可以讓我們像使用普通函式一樣,能夠定義反復重用的通用setup步驟,
兩個不同的測驗函式可以請求相同的fixture,每個測驗函式都會獲得該fixture的各自結果,
這樣的優點就是,確保不同的測驗函式之間不會相互影響,
我們可以使用這種機制來確保每個測驗函式都獲得各自新的、干凈的、一致的資料,
import pytest
# Arrange
@pytest.fixture
def first_entry():
return "a"
# Arrange
@pytest.fixture
def order(first_entry):
return [first_entry]
def test_string(order):
# Act
order.append("b")
# Assert
assert order == ["a", "b"]
def test_int(order):
# Act
order.append(2)
# Assert
assert order == ["a", 2]
從代碼可以看出,fixture函式order雖然先后被兩個測驗函式呼叫,但是每次被呼叫給出的結果都是一樣的,
并不會因為在測驗函式test_string中,進行了order.append("b")后,就影響了order在測驗函式test_int
中的回傳值,
同樣,這些事情換成我們自己來做,那就是這樣的:
def first_entry():
return "a"
def order(first_entry):
return [first_entry]
def test_string(order):
# Act
order.append("b")
# Assert
assert order == ["a", "b"]
def test_int(order):
# Act
order.append(2)
# Assert
assert order == ["a", 2]
entry = first_entry()
the_list = order(first_entry=entry)
test_string(order=the_list)
entry = first_entry()
the_list = order(first_entry=entry)
test_int(order=the_list)
接下來,繼續跟著官方檔案解讀fixtures的特點:一次請求多個fixtures、fixtures被多次請求,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265599.html
標籤:其他
