2024年12月2日 星期一

Pytest - Fixtures (Part 1)


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管理測試中的文件資源)

我們希望測試一個文件的內容是否符合預期,其流程包括:
  1. 建立測試文件:生成一個名為file1.txt的文件,並寫入一些測試內容。
  2. 執行測試:檢查文件內容是否正確。
  3. 清理資源:在測試完成後關閉並刪除該文件。
@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'

測試順利通過,表明文件的內容與預期相符,同時文件在測試完成後被成功刪除。

沒有留言:

張貼留言