天天看點

fixture的單獨使用、fixture與fixture的互相調用

1、fixture的定義方法
fixture:即我們通常所說的前置操作。
格式:
def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
定義fixture:在函數聲明之前加上“@pytest.fixture(scope='')"

(1)scope:scope=''
funtion:目前函數調用
class:目前類調用
module:全部py子產品調用
session:目前包下的py用例都調用

(2)params:預設為None(講解在另一篇部落格)

當不為None時,params裡面的每個值,fixture都會調用一次

(3)name設定為别名(講解在另一篇部落格)



3、conftest的使用
一般将fixture寫入到coonftest.py配置檔案
conftest.py配置需要注意以下幾點:

☆ conftest.py配置腳本名稱是固定的,不能改名稱;

☆ conftest.py與運作的用例要在同一個目錄下,并且有__init__.py檔案;

☆ 不需要import導入 conftest.py,用例會自動查找。



4、檔案結構
           
fixture的單獨使用、fixture與fixture的互相調用
fixture的單獨使用、fixture與fixture的互相調用
5、fixture單個調用
# conftest.py
@pytest.fixture()
def user():
    user='aaa'
    return user

# test_a.py
def test_a(user):
    print(user)
結果:
 test_a.py .aaa  

           
6、fixture多個調用
# conftest.py
@pytest.fixture()
def user():
    user='aaa'
    return user

@pytest.fixture()
def user2():
    user2='bbb'
    return user2

# test_a.py
def test_a(user,user2):
    print(user,user2)
結果:
 test_a.py .aaa bbb




7、fixture中調用fixture
# conftest.py
@pytest.fixture()
def user():
    user='aaa'
    return user

#在psw2中調用另一個fixture:user,當參數傳入即可。
@pytest.fixture()
def psw2(user):
    usr=user
    psw=123
    return user,psw

# test_a.py
def test_c(psw2):
    print(psw2)
結果:('aaa', 123)




8、在fixture下的函數下同時傳參:
# # 在fixture中多參數的傳遞(通過被調用函數傳參)
# funtion_a.py
def funtion_a(test_input1,test_input2):
    test_input1=test_input1
    test_input2=test_input2
    # print(test_input1,test_input2)
    return test_input1,test_input2

if __name__=='__main__':
    funtion_a('aaa','bbb')

# conftest.py
from funtion_a import *
@pytest.fixture()
def psw(user):
    usr=user
    funtion_a('in','out')
    #傳回一個list
    return [usr,funtion_a('in','out')]

# test_a.py
def test_login(psw):
   # 相應的指派一個list,數量對應2個
    [usr,(inout)]=psw
    print('結果為:%s'% [usr,(inout)])

結果:
結果為:['aaa', ('in', 'out')]





9、parametsize與fixture同時使用
# conftest.py
# paramesize與fixture的結合使用
@pytest.fixture(scope="function")
def test_setup():
    a='前置操作傳回值'
    return a


# test_a.py
import pytest
test_data=['a','b','c']
@pytest.mark.parametrize('test_in',test_data)
def test_input_test(test_setup,test_in):
    print(test_setup)
    test_input=test_in
    print(test_input)

test_input.py 
.前置操作傳回值
a
.前置操作傳回值
b
.前置操作傳回值
c
                                                        [100%]

========================== 3 passed in 0.05 seconds ===========================

10、在fixture中存儲testcase的傳回值
# conftest.py
@pytest.fixture(scope="function")
def add(request):
    yield
    print('開始存資料')
    print('存的資料為 %s' % request.config.s)


#test_a.py
# 驗證在fixture後存用例的傳回值
def test_sava(add,request):
    request.config.s='aaa'

結果:
test_a.py .開始存資料
存的資料為 aaa