1. 程式人生 > 其它 >pytest框架之@pytest.fixture()詳細使用

pytest框架之@pytest.fixture()詳細使用

一、簡介

  1.1、有獨立的命名,並通過宣告它們從測試函式、模組、類或整個專案中的使用來啟用;

  1.2、按模組化的方式實現,每個fixture都可以互相呼叫;

  1.3、fixture的範圍從簡單的單元測試到複雜的功能測試,可以對fixture配置引數,或者跨函式function,類class,模組module或整個測試session範圍。

二、用途

  2.1、做測試前後的初始化設定,如測試資料準備,連結資料庫,開啟瀏覽器等這些操作都可以使用fixture來實現;

  2.2、測試用例的前置條件可以使用fixture實現;

2.3、支援經典的xunit fixture ,像unittest使用的setup和teardown;

2.4、可以實現unittest不能實現的功能,比如unittest中的測試用例和測試用例之間是無法傳遞引數和資料的,但是fixture卻可以解決這個問題。

三、fixture可以當做引數傳入

  3.1、定義fixture跟定義普通函式差不多,唯一區別就是在函式上加個裝飾器@pytest.fixture(),fixture命名不要用test_開頭,跟用例區分開。用例才是test_開頭的命名;

  3.2、fixture是可以有返回值的,如果沒return預設返回None。用例呼叫fixture的返回值,直接就是把fixture的函式名稱當成變數傳入;

3.3、fixture裝飾器裡的scope有四個級別的引數。function(不寫預設這個)、class、module、session;

3.4、除scope之外。還有params、autouse、ids、name等;

  3.5、fixture可以返回一個元組、列表或字典;

  3.6、test_用例可傳單個、多個fixture引數;

3.7、fixture與fixture間可相互呼叫。

四、fixture原始碼詳解

  4.1、fixture(scope='function',params=None,autouse=False,ids=None,name=None):

scope:引數可以控制fixture的作用範圍,scope:function(不寫預設這個)、class、module、session

params:一個可選的引數列表,它將導致多個引數呼叫fixture功能和所有測試使用它

autouse:如果True,則為所有測試啟用fixture func可以看到它。如果為False則顯示需要參考來啟用fixture

ids:每個字串id的列表,每個字串對應於params這樣他們就是測試ID的一部分。如果沒有提供ID它們將從params自動生成

name:fixture的名稱。這預設為裝飾函式的名稱。如果fixture在定義它的統一模組中使用,夾具的功能名稱將被請求夾具的功能arg遮蔽,解決這個問題的一種方法時將裝飾函式命令"fixture_<fixturename>"然後使

用"@pytest.fixture(name='<fixturename>')"。

4.2、fixture裡面有個scope引數可以控制fixture的作用範圍:session>module>class>function

function:每一個函式或方法都會呼叫

class:每一個類呼叫一次,一個類中可以有多個方法

module:每一個.py檔案呼叫一次,該檔案內又有多個function和class

session:是多個檔案呼叫一次,可以跨.py檔案呼叫,每個.py檔案就是module