2024年12月10日 星期二

Pytest - Fixtures (Part 5: Factories as Fixtures)


一般的fixture通常回傳靜態的資料,但當測試需要動態生成資料,或根據測試參數生成不同的結果時,就需要用到工廠型 (Factories as Fixtures)。Factories as Fixtures的核心概念是讓fixture回傳一個可呼叫的函式,這樣測試函式就可以多次呼叫這個函式,並動態地生成所需的資料。這種模式適合以下情境:
  • 資料需要根據輸入參數動態生成:根據測試函式提供的參數生成不同類型的集合
  • 同一測試中需要多次生成資料:在同一測試中重複呼叫fixture生成不同的內容
  • 測試的結果依賴於測試函式提供的參數:根據測試函式傳遞的不同參數,回傳不同的結果

範例

以下是一個使用pytest的範例,我們將定義一個能回傳不同集合的Factories as Fixtures。
@pytest.fixture 
def setup05(): #定義一個fixture,能提供不同類型的集合
    def get_structure(name): #定義一個內部函式,根據傳入的名稱回傳不同的集合
        if name == 'list': 
            return [1, 2, 3]
        elif name == 'tuple':
            return (1, 2, 3)
    return get_structure
get_structure會根據傳入的name參數,回傳對應的集合:如果name是 'list',則回傳一個列表;如果是 'tuple',則回傳一個元組。
#測試函式
def test_fact_fixture(setup05):
    assert type(setup05('list')) == list
    assert type(setup05('tuple')) == tuple
setup05('list')會呼叫get_structure函式,並傳入'list'作為參數,因此它應該回傳一個列表 [1, 2, 3]。接著,我們使用assert來檢查返回的結果是否為list類型,tuple部分也是一樣過程。

沒有留言:

張貼留言