結(jié)合上一篇念祭,補(bǔ)充fixture的用法
一担映、什么是fixture?
fixture屬于pytest中的一種方法,可以用作測試用例的前置或后置操作擎厢,通過yield關(guān)鍵字進(jìn)行區(qū)分。
代碼在yield前面的屬于前置操作赁项,代碼在yield后面的屬于后置操作籽暇。可以只存在一種养铸,如果有后置雁芙,一定會執(zhí)行后置的代碼
分析源碼:
def fixture( # noqa: F811
fixture_function: Optional[_FixtureFunction] = None,
*,
scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",
params: Optional[Iterable[object]] = None,
autouse: bool = False,
ids: Optional[
Union[
Iterable[Union[None, str, float, int, bool]],
Callable[[Any], Optional[object]],
]
] = None,
name: Optional[str] = None
) -> Union[FixtureFunctionMarker, _FixtureFunction]:
fixture_marker = FixtureFunctionMarker(
scope=scope, params=params, autouse=autouse, ids=ids, name=name,
)
# Direct decoration.
if fixture_function:
return fixture_marker(fixture_function)
return fixture_marker
二、fixture參數(shù)列表:
scope:可以理解成fixture的作用域钞螟,默認(rèn):function兔甘,還有class、module鳞滨、package洞焙、session四個【常用】
scope = "module",可實現(xiàn)多個.py 跨文件共享前置;只對里面生效澡匪,放conftest對包里所有文件生效
scope = "session"熔任,可實現(xiàn)多個.py 跨文件使用一個session完成多個用例
autouse:默認(rèn):False,需要用例手動調(diào)用該fixture唁情; 如果是True疑苔,所有作用域內(nèi)的測試用例都會自動調(diào)用該fixture;每個函數(shù)都想調(diào)用甸鸟,可采用自動:@pytest.fixture(autouse=True)
name:默認(rèn):裝飾器的名稱惦费,同一模塊的fixture相互調(diào)用建議寫個不同的name
注意:session的作用域:是整個測試會話,即開始執(zhí)行pytest到結(jié)束測試
執(zhí)行順序:session>>module>>class>>function
三哀墓、多個fixture直接可以互相調(diào)用
用例異常后繼續(xù)執(zhí)行后置操作
前面提到過用例出現(xiàn)異常后趁餐,fixture繼續(xù)執(zhí)行后置操作。這里安靜也距離給大家說明篮绰。
將上面的代碼用例中加入斷言內(nèi)容后雷,保證用例3斷言失敗,看看是否會執(zhí)行后置操作(退出登錄)吠各。
三臀突、fixture參數(shù)詳解
1、參數(shù)name
import pytest
@pytest.fixture(name='anjing')
def login():
print('\n登錄操作')
yield
print('\n退出登錄!')
class Test_Login():
def test_01(self, anjing):
print('---用例01---')
def test_02(self):
print('---用例02---')
def test_03(self, anjing):
print('---用例03---')
if __name__ == '__main__':
pytest.main(['-vs'])
執(zhí)行后發(fā)現(xiàn)贾漏,通過參數(shù)name更改過的名字可以直接進(jìn)行調(diào)用候学。
注意:通過name重命名后,繼續(xù)使用以前的名字調(diào)用會報錯纵散。
2梳码、參數(shù)autouse:當(dāng)每個函數(shù)都想調(diào)用,可采用自動
import pytest
@pytest.fixture(autouse=True)
def login():
print("===auto===")
class Test_Login():
def test_o1(self):
print("--自動登錄--")
def test_o2(self):
print("--自動登錄--")
if __name__ == '__main__':
pytest.main(['1super.py','-vs'])
3伍掀、params 表示fixture的參數(shù)化概念
import pytest
data = [12, 'ab']
@pytest.fixture(scope='class', params=data)
def login(request):
print("登錄")
yield request.param
print("登出操作")
def test_case0(login):
print("testcase0")
class TestLogin:
def test_case1(self, login):
print("testcase1")
def test_case2(self, login):
print("testcase2")
if __name__ == '__main__':
pytest.main(['1super.py','-vs'])
4掰茶、ids表示在fixture對參數(shù)化的內(nèi)容進(jìn)行加上標(biāo)識,默認(rèn)是傳參內(nèi)容
import pytest
data = [12, 'ab']
@pytest.fixture(params=data,ids = ['ly=12','ly=ab'])
def login():
print("登錄")
def test_case0(login):
print("testcase0")
if __name__ == '__main__':
pytest.main(['1super.py','-vs'])