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

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

1、pytest中的fixture是什麼

爲可靠的和可重複執行的測試提供固定的基線(能夠理解爲測試的固定配置,使不一樣範圍的測試都可以得到統一的配置),fixture提供了區別於傳統單元測試(setup/teardown)風格的使人驚喜的功能,並且pytest作得更炫。函數

2、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同級目錄下哦)。
3d

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

5.fixture的如何實現teardown

上圖代碼中的 print("teardown smtp")和smtp.close(),會在module範圍內的最後一個測試完成後執行,無論測試中有沒有exception的狀態。
若是咱們在裝飾器中指定scope="function",那麼stmp將會在每次單個測試中創建和清除。it

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

看下運行結果:
io

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

看下運行結果:
function

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

看運行結果:
class

④ 如何運行類的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使用,就先寫這麼多吧,應該能夠知足平常使用的場景了,歡迎補充。

相關文章
相關標籤/搜索