上篇文章中提到了,在pytest中的fixture能夠完成unitest中setUp、tearDown。今天就來詳細看一下。session
爲可靠的和可重複執行的測試提供固定的基線(能夠理解爲測試的固定配置,使不一樣範圍的測試都可以得到統一的配置),fixture提供了區別於傳統單元測試(setup/teardown)風格的使人驚喜的功能,並且pytest作得更炫。函數
1.fixture 能夠做爲一個函數的參數被調用
如上圖, 這裏的 test_ehlo函數,須要參數值smtp_connection,pytest就是找到而且調用這個用@pytest.fixture裝飾的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後)
關於pytest的fixture使用,就先寫這麼多吧,應該能夠知足平常使用的場景了,歡迎補充。