Fixture是一種函式,中文稱之為夾具,用於設置測試環境,在測試之前將測試所需的資源 (例如資料庫連線) 準備好;測試完後清理測試環境,釋放資源,確保測試環境乾淨。
定義Fixture函式
使用 @pytest.fixture 裝飾器來定義Fixture函式。
將Fixture作為參數使用
在測試函式中,直接通過函數的參數名稱調用對應的Fixture,可以將此函數名稱做為傳入參數。使用標記Fixture函式
我們也可使用 @pytest.mark.usefixtures 標記的方法來使用Fixture,但無法使用其回傳值。
Fixture的使用範圍
- Fixture可以定義在測試檔案中:僅適用於該檔案中的測試函式。
- 共用的conftest.py檔案中:允許多個測試檔案共享同一個Fixture。
範例
使用Fixture準備一個城市列表,供多個測試函式使用:
@pytest.fixture()
def setup_list():city = ['New York','London','Tokyo','Taipei','Bangkok']
return city
def test_getItem(setup_list):print(setup_list[1:3])
assert setup_list[0] == 'New York'
assert setup_list[::2] == ['New York','Tokyo','Bangkok']
def myReverse(lst):lst.reverse()
return lst
def test_reverseList(setup_list):assert setup_list[::-2] == ['Bangkok','Tokyo','New York']
assert setup_list[::-1] == myReverse(setup_list)
在這個例子中,setup_list是一個Fixture,提供了一個包含多個城市的列表,測試函式可以直接使用。
使用yield在Fixture中分隔設置與清理
Pytest的Fixture中,yield是用來分隔前置設置 (setup) 和後置清理 (teardown) 的重要工具。- yield前面的部分執行前置設置操作,用來準備測試所需的資源。
- yield後面的部分執行後續清理操作,確保測試完成後資源得到正確釋放。
- yield的回傳值可以提供給測試函式作為資源使用。
範例 (使用Pytest Fixture管理測試中的文件資源)
我們希望測試一個文件的內容是否符合預期,其流程包括:- 建立測試文件:生成一個名為file1.txt的文件,並寫入一些測試內容。
- 執行測試:檢查文件內容是否正確。
- 清理資源:在測試完成後關閉並刪除該文件。
@pytest.fixture()測試順利通過,表明文件的內容與預期相符,同時文件在測試完成後被成功刪除。
def setup03():
filename = 'file1.txt' #創建並寫入文件
f = open(filename, 'w')
f.write("Pytest is good")
f.close()
f = open(filename, 'r+') #打開文件並傳遞給測試函數
yield f
f.close()
os.remove(filename) #關閉並刪除文件
def test_filetest(setup03):
assert (setup03.readline()) == 'Pytest is good'
沒有留言:
張貼留言