6.pytest 強大的 fixture (上)

Maple發表於2020-12-27

pytest強大的fixture(上)

測試fixture的目的是提供一個測試的基線,在此基線基礎上,可以更可靠的進行重複測試。Pytest的 fixture相對於傳統的xUnit的setup/teardown函式做了顯著的改進:

  • 測試fixture有明確的名稱,通過在函式/模組/類或者整個專案中啟用來使用 。

  • 測試fixture是模組化的實現,使用fixture名即可觸發特定的fixture,fixture可以在其他fixture中 進行使用 。

  • 測試fixture不僅可以進行簡單的單元測試,也可以進行復雜的功能測試。可以根據配置和元件的 選項進行引數化定製測試,或者跨函式/類/模組或者整個測試過程進行測試。

作為函式入參的fixture

測試函式可以通過接受一個已經命名的fixture物件來使用他們。對於每個引數名,如果fixture已經宣告定義,會自動建立一個例項並傳入該測試函式。fixture函式通過裝飾器標誌@pytest.fixture來註冊。下面是一個簡單的獨立的測試模組,包含一個fixture及使用它的測試函式

# test_fixture.py
import pytest


@pytest.fixture
def smtp_connection():
import smtplib
return smtplib.SMTP("smtp.qq.com", 587, timeout=5)

def test_ehlo(smtp_connection):
response, msg = smtp_connection.ehlo()
assert response == 250
assert 0 # 用於除錯

這裡,test_ehlo需要smtp_connection這個fixture的返回。pytest會在@pytest.fixture的fixture中查詢並呼叫名為smtp_connection的fixture。執行這個測試結果如下:

(pytest) D:\study\auto-pytest>pytest test_fixture.py
=============================== test session starts ===============================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
collected 1 item
test_fixture.py F [100%]

=============================== FAILURES ===============================
_______________________________ test_ehlo _______________________________

smtp_connection = <smtplib.SMTP object at 0x0000014FA26653C8>

def test_ehlo(smtp_connection):
response, msg = smtp_connection.ehlo()
assert response == 250
> assert 0 # 用於除錯
E assert 0

test_fixture.py:11: AssertionError
=============================== short test summary info ===============================
FAILED test_fixture.py::test_ehlo - assert 0
=============================== 1 failed in 0.31s ===============================

測試的回顯中可以看出測試函式呼叫了smtp_connection,這是由fixture函式建立的smtplib.SMTP() 的一個例項。該函式在我們故意新增的assert 0處失敗。以下是pytest的在呼叫該函式的時候的詳細規則:

  • pytest找到以test_作為字首的測試用例test_ehlo。該測試函式有一個名為smtp_connection的 入參。而在fixture函式中存在一個名為smtp_connection的fixture。
  • smtp_connection()被呼叫來建立一個例項。
  • test_ehlo()被呼叫並在最後一行因為斷言失敗。注意,如果拼錯了函式引數,或者使用了一個不可用的引數,你會看到一個包含可用函式引數列表的錯誤資訊

注意:你可以使用 pytest --fixtures test_fixture.py 來檢視可用的fixture(如果想檢視以_開頭的fixture,請新增-v引數)

conftest.py:共享fixture函式

實現測試用例的過程中,當你發現需要使用來自多個檔案的fixture函式的時候,可以將這些fixture函式放到conftest.py中。

你不需要匯入這些fixture函式,它會由pytest自動檢索。

fixture函式的檢索順序是從測試類開始,然後測試的模組,然後就是conftest.py檔案,最後是內建的外掛和第三方外掛。

你還可以使用conftest.py來為本地每個目錄實現外掛 。

相關文章