pytest解讀一次請求多個fixtures及多次請求

跟著節奏繼續來探索fixtures的靈活性。

一、一個測試函數/fixture一次請求多個fixture

在測試函數和fixture函數中,每一次並不局限於請求一個fixture。他們想要多少就可以要多少。

下面是另一個簡單的例子:

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):
    # 這是一個fixture函數,請求瞭2個其他的fixture函數
    return [first_entry, second_entry]
# Arrange
@pytest.fixture
def expected_list():
    return ["a", 2, 3.0]
def test_string(order, expected_list):
    # 這是一個測試函數,請求瞭2個不同的fixture函數
    # Act
    order.append(3.0)
    # Assert
    assert order == expected_list

可以看出,在fixture函數order中,請求瞭2個其他的fixture函數,分別是:first_entry、second_entry。

在測試函數test_string中,請求瞭2個不同的fixture函數,分別是:order、expected_list。

二、每個測試函數可以多次請求fixtures(返回值被緩存)

在同一個測試函數中,fixture也可以被請求多次。但是在這個測試函數中,pytest在第一次執行fixture函數之後,不會再次執行它們。

如果第一次執行fixture函數有返回值,那麼返回值會被緩存起來。

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第一次被請求,返回一個列表[]
    # 接著,order空列表增加瞭first_entry的返回值,此時的order變成瞭["a"],被緩存起來
    return order.append(first_entry)
def test_string_only(append_first, order, first_entry):
    # 在測試函數裡,order第二次被請求,但是並不會拿到空列表[],而且拿到瞭被緩存起來的["a"]
    # 所以斷言order == [first_entry],其實就是 ["a"] == ["a"],測試通過
    # Assert
    assert order == [first_entry]

從示例中可以看出:

  • 在fixture函數append_first中,order第一次被請求,返回一個列表[],被緩存起來。
  • 接著,order.append(first_entry)在[]中增加瞭first_entry的返回值,所以,此時的order變成瞭["a"]。
  • 最後,在測試函數test_string_only中,order第二次被請求,但是並不會拿到空列表[],而且拿到瞭被緩存起來的["a"]。這樣的話,最後的斷言assert order == [first_entry]就會成功。

反過來,如果同一個fixture在一個測試函數中每次都去請求一次,那上面的測試函數必然失敗。

因為,這樣一來,雖然在append_first中的返回值仍然是["a"],但是在test_string_only中,又去重新請求瞭一次order,拿到的其實是空列表[],所以最後斷言會失敗。

以上就是pytest解讀一次請求多個fixtures及多次請求 的詳細內容,更多關於pytest解讀fixtures請求 的資料請關註WalkonNet其它相關文章!

推薦閱讀: