2024年12月5日 星期四

Pytest - Fixtures (Part 2: Conftest.py)


使用pytest_configure設定全域變數

在使用Pytest進行測試時,我們常常需要在多個測試模組之間共享某些變數。然而,直接使用普通的Python變數可能會遇到作用域 (Scope) 限制的問題,因為這些變數的作用範圍僅限於它們所在的模組。如果需要在其他模組中使用,則必須手動導入,這會增加代碼的複雜性。為了解決這個問題,Pytest提供了一個內建的全域命名空間管理機制。
透過pytest_configure鉤子函式 (Hook Function),我們可以輕鬆地在測試模組之間共享全域變數,而無需擔心作用域或名稱衝突。

如何使用pytest_configure和conftest.py

在Pytest中,conftest.py是一個非常實用的設定文件,它可以用來管理鉤子函式、全域變數以及Fixtures。以下是一個簡單的範例:

1. 建立conftest.py並設定全域變數

在conftest.py 中,我們可以利用pytest_configure函式來設定全域變數:
# conftest.py
import pytest

def pytest_configure():
    pytest.weekdays1 = ['mon', 'tue', 'wed']
    pytest.weekdays2 = ['fri', 'sat', 'sun']
這裡,我們設定了兩個全域變數weekdays1和weekdays2,它們將自動對所有測試模組生效。

2. 在Fixtures中使用全域變數

我們可以透過Fixtures引用這些全域變數,並根據測試需求進行擴展或修改:
import pytest
@pytest.fixture(scope="module")
def setup01():
    wk = pytest.weekdays1.copy()
    wk.append('thur')  #添加星期四
    yield wk
    print("\nFixture setup01 closing")

@pytest.fixture()
def setup02():
    wk2 = pytest.weekdays2.copy()
    wk2.insert(0, 'thur')  #在列表開頭插入星期四
    yield wk2
我們定義了兩個Fixtures,分別使用pytest_configure中的weekdays1和weekdays2。

3. 在測試中引用Fixtures

接下來,我們在測試案例中使用這些Fixtures:
def test_example_01(setup01):
    assert 'thur' in setup01
    assert setup01 == ['mon', 'tue', 'wed', 'thur']

def test_example_02(setup02):
    assert 'thur' in setup02
    assert setup02 == ['thur', 'fri', 'sat', 'sun']
這些測試通過引用setup01和setup02,驗證了我們的全域變數在不同測試環境中的行為。

conftest.py的優點

  • 自動匯入:conftest.py是Pytest的內建功能,無需在測試模組中手動匯入即可使用,同時Pytest會自動處理變數的載入和應用。
  • 作用域廣:conftest.py定義的Fixtures和變數對當前目錄及其子目錄的所有測試模組有效,這樣可以保證測試環境的一致性。
  • 支援多層設定:Pytest支持在不同目錄中創建多個conftest.py文件。子目錄中的 conftest.py可以覆蓋父目錄中同名的fixture,提供靈活的測試環境定義。

沒有留言:

張貼留言