一、fixture參數化是什麼?
fixture
參數化是Pytest的一個功能,用於簡化測試的編寫。在測試中,經常需要使用一些公共的配置和資源,比如定義一些變量、打開數據庫連接、定義一個HTTP請求等操作。將這些通用的配置和資源封裝在fixture
中,只需要在需要的測試用例中調用即可。參數化則可以在運行測試用例時自動將一組或多組參數傳遞給fixture
,以方便在測試中使用。
二、fixture參數化的使用場景
fixture
參數化可以用於測試用例之前或之後的操作,同時也可以用於數據驅動測試。下面分幾個場景進行講解。
1. fixture參數化用於測試用例之前的操作
有些測試用例需要在運行前進行一些預處理操作,比如讀取文件、建立數據庫連接等。使用fixture
可以將這些預處理的操作封裝進去,在測試用例中直接調用即可。例如:
import pytest @pytest.fixture def prepare_data(): data = {'name': 'Tom', 'age': 20, 'gender': 'male'} return data def test_case1(prepare_data): assert prepare_data['name'] == 'Tom' assert prepare_data['age'] > 0 assert prepare_data['gender'] == 'male'
在上面的例子中,prepare_data
是一個fixture
,返回了一個字典類型的數據data
。在test_case1
測試用例中,直接調用prepare_data
即可獲取data
。
2. fixture參數化用於測試用例之後的操作
有些測試用例需要在運行後進行一些清理操作,比如關閉數據庫連接、刪除文件等。同樣可以使用fixture
將這些操作進行封裝,在測試用例中調用。例如:
import pytest @pytest.fixture def prepare_data(): data = {'name': 'Tom', 'age': 20, 'gender': 'male'} yield data print('Clear data') def test_case1(prepare_data): assert prepare_data['name'] == 'Tom' assert prepare_data['age'] > 0 assert prepare_data['gender'] == 'male'
在上面的例子中,prepare_data
是一個fixture
,使用yield
關鍵字可以將清理操作寫在yield
之後,這樣在測試用例運行完畢後自動執行清理操作。
3. fixture參數化用於數據驅動測試
數據驅動測試是一種測試方法,通過將不同的數據傳遞給同一個測試用例來驗證不同的場景。可以使用fixture
參數化實現數據驅動測試,例如:
import pytest @pytest.fixture(params=[('Tom', 20, 'male'), ('Jerry', 30, 'female')]) def prepare_data(request): return {'name': request.param[0], 'age': request.param[1], 'gender': request.param[2]} def test_case1(prepare_data): assert prepare_data['name'] != '' assert prepare_data['age'] > 0 assert prepare_data['gender'] in ('male', 'female')
在上面的例子中,prepare_data
是一個fixture
,使用params
參數給fixture
傳遞了兩組測試數據。request.param
可以獲取當前參數化的值,將其轉換成字典格式即可傳遞給測試用例。
三、fixture參數化的使用注意點
在使用fixture
參數化時,需要注意以下幾點:
1. fixture的scope
fixture
有4種scope,用於指定fixture的作用域。scope的取值包括:function(默認)、class、module、session。分別表示fixture的作用域是函數級別、類級別、模塊級別、會話級別。在fixture
中進行一些全局的配置或者數據準備時,可以選擇模塊級別或會話級別作用域。
import pytest @pytest.fixture(scope="module") def prepare_data(): data = ['Tom', 'Jerry', 'Alice'] return data def test_case1(prepare_data): assert prepare_data[0] == 'Tom' def test_case2(prepare_data): assert prepare_data[1] == 'Jerry'
2. fixture的依賴關係
在定義fixture
時,可以指定它依賴於其他的fixture
。這樣,在測試用例中使用當前fixture
時,所依賴的fixture
會自動被調用。
import pytest @pytest.fixture def prepare_data(): data = {'name': 'Tom', 'age': 20, 'gender': 'male'} return data @pytest.fixture def config(): return {'url': 'http://127.0.0.1', 'port': 8080} @pytest.fixture def db(config): db = 'mysql://{0}:{1}'.format(config['url'], config['port']) return db def test_case1(db, prepare_data): assert prepare_data['name'] == 'Tom' print(db)
在上面的例子中,db
的定義依賴於config
,因此在db
調用時會自動調用config
。在測試用例test_case1
中調用db
和prepare_data
時,會自動調用所依賴的fixture
。
3. fixture參數化的優先級
在參數化時,可以使用pytest.mark.parametrize()
函數來指定fixture
的值,這樣可以覆蓋fixture
中的默認值。需要注意的是,fixture
的優先級高於parametrize
,即如果對同一個fixture
同時指定了默認值和參數化值,則會使用fixture
的默認值。
import pytest @pytest.fixture def prepare_data(): data = {'name': 'Tom', 'age': 20, 'gender': 'male'} return data @pytest.mark.parametrize('prepare_data', [{'name': 'Jerry', 'age': 30, 'gender': 'female'}]) def test_case1(prepare_data): assert prepare_data['name'] == 'Jerry' assert prepare_data['age'] == 30 assert prepare_data['gender'] == 'female'
在上面的例子中,prepare_data
定義了一個默認值,又使用parametrize
函數對其進行了參數化。但是由於fixture
的優先級高於parametrize
,所以最終使用的是fixture
的默認值。
四、小結
在使用Pytest進行測試時,fixture
是一個非常常用的功能,可以用於簡化測試用例的編寫,同時可以實現數據驅動測試和測試用例的前置和後置處理。在使用fixture
參數化時,需要注意fixture
的作用域、依賴關係和參數化的優先級等問題,以保證測試用例的正確運行。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/151881.html