pytestfixture參數化的使用詳解

一、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中調用dbprepare_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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-12 00:53
下一篇 2024-11-12 00:53

相關推薦

  • 三星內存條參數用法介紹

    本文將詳細解釋三星內存條上面的各種參數,讓你更好地了解內存條並選擇適合自己的一款。 一、容量大小 容量大小是內存條最基本的參數,一般以GB為單位表示,常見的有2GB、4GB、8GB…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python input參數變量用法介紹

    本文將從多個方面對Python input括號里參數變量進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Spring Boot中發GET請求參數的處理

    本文將詳細介紹如何在Spring Boot中處理GET請求參數,並給出完整的代碼示例。 一、Spring Boot的GET請求參數基礎 在Spring Boot中,處理GET請求參…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • Python Class括號中的參數用法介紹

    本文將對Python中類的括號中的參數進行詳細解析,以幫助初學者熟悉和掌握類的創建以及參數設置。 一、Class的基本定義 在Python中,通過使用關鍵字class來定義類。類包…

    編程 2025-04-29
  • 全能編程開發工程師必知——DTD、XML、XSD以及DTD參數實體

    本文將從大體介紹DTD、XML以及XSD三大知識點,同時深入探究DTD參數實體的作用及實際應用場景。 一、DTD介紹 DTD是文檔類型定義(Document Type Defini…

    編程 2025-04-29
  • Python可變參數

    本文旨在對Python中可變參數進行詳細的探究和講解,包括可變參數的概念、實現方式、使用場景等多個方面,希望能夠對Python開發者有所幫助。 一、可變參數的概念 可變參數是指函數…

    編程 2025-04-29
  • XGBoost n_estimator參數調節

    XGBoost 是 處理結構化數據常用的機器學習框架之一,其中的 n_estimator 參數決定着模型的複雜度和訓練速度,這篇文章將從多個方面詳細闡述 n_estimator 參…

    編程 2025-04-28

發表回復

登錄後才能評論