一? conftest特點:
1、可以跨.py文件調(diào)用,有多個.py文件調(diào)用時,可讓conftest.py只調(diào)用了一次fixture抬吟,或調(diào)用多次fixture
2、conftest.py與運行的用例要在同一個pakage下统抬,并且有__init__.py文件
3拗军、不需要import導(dǎo)入 conftest.py任洞,pytest用例會自動識別該文件,放到項目的根目錄下就可以全局目錄調(diào)用了发侵,如果放到某個package下,那就在改package內(nèi)有效妆偏,可有多個conftest.py
4刃鳄、conftest.py配置腳本名稱是固定的,不能改名稱
5钱骂、conftest.py文件不能被其他文件導(dǎo)入
6叔锐、所有同目錄測試文件運行前都會執(zhí)行conftest.py文件
conftest應(yīng)用場景
1、每個接口需共用到的token
2见秽、每個接口需共用到的測試用例數(shù)據(jù)
3愉烙、每個接口需共用到的配置信息
二? conftest用法結(jié)合fixture使用:
1、fixture源碼詳解
fixture(scope='function'解取,params=None步责,autouse=False,ids=None禀苦,name=None):
fixture里面有個scope參數(shù)可以控制fixture的作用范圍蔓肯,scope:有四個級別參數(shù)"function"(默認(rèn)),"class"振乏,"module"蔗包,"session
params:一個可選的參數(shù)列表,它將導(dǎo)致多個參數(shù)調(diào)用fixture功能和所有測試使用它慧邮。
autouse:如果True调限,則為所有測試激活fixture func可以看到它。如果為False則顯示需要參考來激活fixture
ids:每個字符串id的列表误澳,每個字符串對應(yīng)于params這樣他們就是測試ID的一部分耻矮。如果沒有提供ID它們將從params自動生成
name:fixture的名稱。這默認(rèn)為裝飾函數(shù)的名稱脓匿。如果fixture在定義它的統(tǒng)一模塊中使用淘钟,夾具的功能名稱將被請求夾具的功能arg遮蔽,解決這個問題的一種方法時將裝飾函數(shù)命令"fixture_"然后使用"@pytest.fixture(name='')"陪毡。
2米母、fixture的作用范圍
fixture里面有個scope參數(shù)可以控制fixture的作用范圍:session>module>class>function
-function:每一個函數(shù)或方法都會調(diào)用
-class:每一個類調(diào)用一次,一個類中可以有多個方法
-module:每一個.py文件調(diào)用一次毡琉,該文件內(nèi)又有多個function和class
-session:是多個文件調(diào)用一次铁瞒,可以跨.py文件調(diào)用,每個.py文件就是module
function默認(rèn)模式@pytest.fixture(scope='function')或?@pytest.fixture()
3桅滋、conftest結(jié)合fixture的使用
conftest中fixture的scope參數(shù)為session慧耍,所有測試.py文件執(zhí)行前執(zhí)行一次
conftest中fixture的scope參數(shù)為module身辨,每一個測試.py文件執(zhí)行前都會執(zhí)行一次conftest文件中的fixture
conftest中fixture的scope參數(shù)為class,每一個測試文件中的測試類執(zhí)行前都會執(zhí)行一次conftest文件中的fixture
conftest中fixture的scope參數(shù)為function芍碧,所有文件的測試用例執(zhí)行前都會執(zhí)行一次conftest文件中的fixture
三? 代碼示例:
__init__.py
import pytest
if __name__=='__main__':
? ? pytest.main(["-s","test02.py","test03.py"])
test02.py
import pytest
# test02.py
class Test(object):
? ? def test_two(self,get_token):
? ? ? ? token= 'abcdefg'
? ? ? ? print("【執(zhí)行test02.py-Test類-test2用例,獲取get_token:%s】" %get_token)
assert get_token== token
test03.py
import pytest
class Test(object):
? ? def test_three(self,get_token):
? ? ? ? token= 'abcdefg'
? ? ? ? print("【執(zhí)行test03.py-Test類-test3用例,獲取get_token:%s】" %get_token)
assert get_token== token
def test_four(self,get_token):
? ? ? ? token= '123456'
? ? ? ? print("【執(zhí)行test03.py-Test類-test4用例,獲取get_token:%s】" %get_token)
assert get_token== token
conftest.py
import pytest
@pytest.fixture(scope='session')
def get_token():
? ? token= 'abcdefg'
? ? print('獲取到token:%s' % token)
return token
執(zhí)行結(jié)果
collected 3 items
test02.py 獲取到token:abcdefg
【執(zhí)行test02.py-Test類-test2用例,獲取get_token:abcdefg】
.
test03.py 【執(zhí)行test03.py-Test類-test3用例,獲取get_token:abcdefg】
.【執(zhí)行test03.py-Test類-test4用例,獲取get_token:abcdefg】
F
================================== FAILURES ===================================
_______________________________ Test.test_four ________________________________
self = <pytest演練.test03.Test object at 0x000001CED7A6CF98>
get_token = 'abcdefg'
? ? def test_four(self,get_token):
? ? ? ? token = '123456'
? ? ? ? print("【執(zhí)行test03.py-Test類-test4用例,獲取get_token:%s】" %get_token)
>? ? ? assert get_token == token
E? ? ? AssertionError
test03.py:10: AssertionError
========================= 1 failed, 2 passed in 0.09s =========================