使用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.pyimport pytestdef 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 wkprint("\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 setup01assert setup01 == ['mon', 'tue', 'wed', 'thur']def test_example_02(setup02):assert 'thur' in setup02assert setup02 == ['thur', 'fri', 'sat', 'sun']
這些測試通過引用setup01和setup02,驗證了我們的全域變數在不同測試環境中的行為。
conftest.py的優點
- 自動匯入:conftest.py是Pytest的內建功能,無需在測試模組中手動匯入即可使用,同時Pytest會自動處理變數的載入和應用。
- 作用域廣:conftest.py定義的Fixtures和變數對當前目錄及其子目錄的所有測試模組有效,這樣可以保證測試環境的一致性。
- 支援多層設定:Pytest支持在不同目錄中創建多個conftest.py文件。子目錄中的 conftest.py可以覆蓋父目錄中同名的fixture,提供靈活的測試環境定義。
沒有留言:
張貼留言