Pytest全局用例共用之conftest.py詳解
一、conftest特點:
1、可以跨.py文件調用,有多個.py文件調用時,可讓conftest.py只調用了一次fixture,或調用多次fixture
2、conftest.py與運行的用例要在同一個pakage下,並且有__init__.py文件
3、不需要import導入 conftest.py,pytest用例會自動識別該文件,放到項目的根目錄下就可以全局目錄調用了,如果放到某個package下,那就在改package內有效,可有多個conftest.py
4、conftest.py配置腳本名稱是固定的,不能改名稱
5、conftest.py文件不能被其他文件導入
6、所有同目錄測試文件運行前都會執行conftest.py文件
二、’conftest用法:
conftest文件實際應用需要結合fixture來使用,fixture中參數scope也適用conftest中fixture的特性,這里再說明一下
1、fixture源碼詳解
fixture(scope='function',params=None,autouse=False,ids=None,name=None):
fixture里面有個scope參數可以控制fixture的作用范圍,scope:有四個級別參數"function"(默認),"class","module","session
params:一個可選的參數列表,它將導致多個參數調用fixture功能和所有測試使用它。
autouse:如果True,則為所有測試激活fixture func可以看到它。如果為False則顯示需要參考來激活fixture
ids:每個字符串id的列表,每個字符串對應於params這樣他們就是測試ID的一部分。如果沒有提供ID它們將從params自動生成
name:fixture的名稱。這默認為裝飾函數的名稱。如果fixture在定義它的統一模塊中使用,夾具的功能名稱將被請求夾具的功能arg遮蔽,解決這個問題的一種方法時將裝飾函數命令"fixture_
2、fixture的作用范圍
fixture里面有個scope參數可以控制fixture的作用范圍:session>module>class>function
-function:每一個函數或方法都會調用
-class:每一個類調用一次,一個類中可以有多個方法
-module:每一個.py文件調用一次,該文件內又有多個function和class
-session:是多個文件調用一次,可以跨.py文件調用,每個.py文件就是module
function默認模式@pytest.fixture(scope='function')或 @pytest.fixture()
3、conftest結合fixture的使用
conftest中fixture的scope參數為session,所有測試.py文件執行前執行一次
conftest中fixture的scope參數為module,每一個測試.py文件執行前都會執行一次conftest文件中的fixture
conftest中fixture的scope參數為class,每一個測試文件中的測試類執行前都會執行一次conftest文件中的fixture
conftest中fixture的scope參數為function,所有文件的測試用例執行前都會執行一次conftest文件中的fixture
三、conftest應用場景
1、每個接口需共用到的token
2、每個接口需共用到的測試用例數據
3、每個接口需共用到的配置信息
四、代碼實例
多個.py文件只調用1次fixture
import pytest
# conftest.py
@pytest.fixture(scope='session')
def get_token():
token = 'qeehfjejwjwjej11sss@22'
print('獲取到token:%s' % token)
return token
import pytest
# test02.py
class Test(object):
def test2(self,get_token):
token = 'qeehfjejwjwjej11sss@22'
print("【執行test02.py-Test類-test2用例,獲取get_token:%s】" %get_token)
assert get_token == token
if __name__=="__main__":
pytest.main(["-s","test02.py","test03.py"])
import pytest
#test03.py
class Test(object):
def test3(self,get_token):
token = 'qeehfjejwjwjej11sss@22'
print("【執行test03.py-Test類-test3用例,獲取get_token:%s】" %get_token)
assert get_token == token
def test4(self,get_token):
token = 'qeehfjejwjwjej11sss@22'
print("【執行test03.py-Test類-test4用例,獲取get_token:%s】" %get_token)
assert get_token == token
if __name__=="__main__":
pytest.main(["-s","test02.py","test03.py"])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 items
test02.py 獲取到token:qeehfjejwjwjej11sss@22
【執行test02.py-Test類-test2用例,獲取get_token:qeehfjejwjwjej11sss@22】
.
test03.py 【執行test03.py-Test類-test3用例,獲取get_token:qeehfjejwjwjej11sss@22】
.【執行test03.py-Test類-test4用例,獲取get_token:qeehfjejwjwjej11sss@22】
.
============================== 3 passed in 0.30s ==============================
————————————————
使用多個fixture
如果用例需要用到多個fixture的返回數據,fixture也可以return一個元組、list或字典,然后從里面取出對應數據。
# test_fixture4.py
import pytest
@pytest.fixture()
def user():
print("獲取用戶名")
a = "yoyo"
b = "123456"
return (a, b)
def test_1(user):
u = user[0]
p = user[1]
print("測試賬號:%s, 密碼:%s" % (u, p))
assert u == "yoyo"
if __name__ == "__main__":
pytest.main(["-s", "test_fixture4.py"])
當然也可以分開定義成多個fixture,然后test_用例傳多個fixture參數
# test_fixture5.py
import pytest
@pytest.fixture()
def user():
print("獲取用戶名")
a = "yoyo"
return a
@pytest.fixture()
def psw():
print("獲取密碼")
b = "123456"
return b
def test_1(user, psw):
'''傳多個fixture'''
print("測試賬號:%s, 密碼:%s" % (user, psw))
assert user == "yoyo"
if __name__ == "__main__":
pytest.main(["-s", "test_fixture5.py"])
fixture與fixture互相調用
fixture與fixture直接也能互相調用的
import pytest
@pytest.fixture()
def first():
print("獲取用戶名")
a = "yoyo"
return a
@pytest.fixture()
def sencond(first):
'''psw調用user fixture'''
a = first
b = "123456"
return (a, b)
def test_1(sencond):
'''用例傳fixture'''
print("測試賬號:%s, 密碼:%s" % (sencond[0], sencond[1]))
assert sencond[0] == "yoyo"
if __name__ == "__main__":
pytest.main(["-s", "test_fixture6.py"])
————————————————
版權聲明:本文為CSDN博主「王大力測試進階之路」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36502272/article/details/102975467