【pytest】(六) pytest中fixture的使用


上篇文章中提到了,在pytest中的fixture可以完成unitest中setUp、tearDown。今天就來詳細看一下。

一、pytest中的fixture是什么

為可靠的和可重復執行的測試提供固定的基線(可以理解為測試的固定配置,使不同范圍的測試都能夠獲得統一的配置),fixture提供了區別於傳統單元測試(setup/teardown)風格的令人驚喜的功能,而且pytest做得更炫。

二、pytest中fixture的使用

1.fixture 可以作為一個函數的參數被調用

如上圖, 這里的 test_ehlo函數,需要參數值smtp_connection,pytest就是找到並且調用這個用@pytest.fixture裝飾的smtp_connection函數。
換句話講,被裝飾器裝飾的函數或者方法,仍然可以被調用。步驟是這樣的:

  • pytest 找到test_ 開頭的函數,於是找到了test_ehlo
  • test_ehlo這個測試函數,需要一個參數smtp_connection,於是函數smtp_connection被找到
  • smtp_connection被調用來創建一個實例

2.fixture可以在一個類、或者一個模塊、或者整個session中被共享,加上范圍即可

如上圖,加入scope=“module”的參數,可以讓fixture function在每次模塊測試的時候只請求一次。這樣不同的test function在同一個test module中接收到的 smtpfixture參數都是一樣的。這里的smtp_connection,就可以在這個模塊中,共享使用。類似的:
如果想在一個類中使用,那么@pytest.fixture(scope="class");
如果想在全部會話中使用,那么@pytest.fixture(scope="session")。

3.fixture也可以單獨存放
有的時候為了方便配置和訪問,也可以將這樣的fixture放到conftest.py文件中單獨存放(注意:該文件要放在case同級目錄下哦)。

4.同一個模塊里出現多個范圍的裝飾
當出現多個范圍裝飾的時候,優先實例化范圍優先級高的。
也就是優先級從大到小:session-->module–->class–->function

5.fixture的如何實現teardown

上圖代碼中的 print("teardown smtp")和smtp.close(),會在module范圍內的最后一個測試完成后執行,不管測試中有沒有exception的狀態。
如果我們在裝飾器中指定scope="function",那么stmp將會在每次單個測試中建立和清除。

6.fixture中的參數 autouse
關於autouse,默認是False, 如果不加scope='session',的使用autouse,只在當前module下有效。
① 如果你想一個module下的都用上,那就打開改成True, 如下,這樣就不需要往每個函數里傳入fixture,例如:

看下運行結果:

② 同樣的,當我加上scope="class"時,當前模塊下的所有類,都會調用一次fixture。

看下運行結果:

③ 文件中同時包含了function,class,就不可以使用autouse了,否則function也會執行到

看運行結果:

④ 如何運行類的fixture
這里使用一個更加通用的方法即可,@pytest.mark.usefixtures("這里是你要用的fixture"),標記在你要使用的類。

看下運行結果:

這里要注意的是:scope=“class”,別忘記添加,否則類下的每個function都會執行。

⑤ 當scope='session'時,要注意的點!
如果你的scope='session',那么不要像function,class,module那樣,和case放在一起,我們要放在另一個文件,conftest.py下,才可以。
這里是同一個項目下的,2個case文件:


還有個同項目下的 conftest.py:

運行測試case,這個2個case文件下的所有case都會被找到,但是只會執行一次conftest.py中的 fixture。

⑥ 當case里需要傳入多個 fixture 或者 yield 怎么辦呢? 先后執行的順序是什么?
在后續使用的過程中,遇到了case里我想傳入多個yield,於是寫了demo驗證了下。下面上結果,就不放截圖啦(形式傳參“before”表示執行在case前,“yield”表示執行在case后)

  • def test_1(before, yield) 與 def test_1(yield,before)
    結論:不管你順序如何,依舊會先執行case前的before,case結束后執行yield
  • def test_2(before1, before2, yield)
    結論:這樣有多個before,會依次按傳參順序先后執行。
  • def test_3(before, yield1, yield2)
    結論:這樣有多個yield的,會依次從后往前執行,這里先執行yield2,再執行yield1。

關於pytest的fixture使用,就先寫這么多吧,應該可以滿足日常使用的場景了,歡迎補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM