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其它相關文章!
推薦閱讀:
- pytest官方文檔解讀fixtures調用fixtures及fixture復用性
- pytest官方文檔解讀fixtures
- pytest解讀fixture有效性及跨文件共享fixtures
- pytest官方文檔解讀fixtures的autouse
- pytest官方文檔解讀fixtures的調用方式