每天的專案會同步到 github 上,可以前往 這個網址 如果對於專案有興趣或是想討論一些問題,歡迎留言 OR 來信討論,信箱為:nickchen1998@gmail.com
白話來說 conftest.py 就是一個可以讓我們存放 "經常被使用到" 的 fixture 的地方,被存放在 conftest.py 當中的 fixture 不需要透過 import就可以直接進行使用,pytest 在一開始執行時,就會先去抓是否有 conftest.py 的存在,因此若今天發現你的 fixture 被許多個 test module 使用到的話不彷可以試著將 fixture 放到 conftest.py 當中
順帶一提 conftest.py 的有效範圍是從 conftest.py 所存在的當前目錄以及其所有子目路中的 test case 都可以使用,若於不同目錄則需要另外寫一個 conftest.py
在本次的範例當中,會利用新增 pytest cmd argument 的方式來進行範例展示,下方附上本次專案目錄的結構
import json
import pytest
def pytest_addoption(parser):
parser.addoption("--permission", default="RD")
@pytest.fixture(name="permission")
def permission_fixture(pytestconfig):
role = pytestconfig.getoption("permission")
with open("./permission.json", "r") as file:
permission_data = json.loads(file.read())
if role == "RD":
permission = permission_data["RD"]
else:
permission = permission_data["costumer"]
return permission
{
"RD": [
"select",
"update",
"delete"
],
"costumer": [
"select"
]
}
import pytest
def test_select_permission(permission: list):
if "select" in permission:
assert True
else:
assert False
def test_update_permission(permission: list):
if "update" in permission:
assert True
else:
with pytest.raises(ValueError) as exc:
raise ValueError("permission not allow")
print(str(exc.value))
assert str(exc.value) == "permission not allow"
pytest -s -v --permission costumer .\test_demo.py
可以看到當 permission 為 costumer 時,成功地引發了錯誤並通過錯誤訊息的驗證
pytest -s -v --permission RD .\test_demo.py
當權限為 RD 時,則 update 的部分不會引發錯誤
上面使用了控制權限這個情境來展示 conftest.py 的應用,最後我們來總結一下,conftest.py 大致上應用的原則就是當 fixture 需要同時給予很多 test case 使用時,才需要將 fixture 放到 conftest.py 當中,如果是只有某些項目需要使用到的 fixture 的話,筆者還是建議可以另外開一個 fixtures 來進行存放會比較好,才比較符合 conftest.py 的定位
pytest 的部份我們就講解到今天為止,明天開始我們會花大約兩天的時間來進行 TDD 開發模式的講解,以及實際利用此方式撰寫一個簡單的小程式