pytest--fixture參數化的實現方式和執行順序


之前看到fixture函數可以通過添加,params參數來實現參數化,后續看到了悠悠 的博客,可以通過@pytest.mark.parametrize來實現,現在做一個總結

實現方式一

通過params函數實現fixture的參數化

import pytest

@pytest.fixture(params=[1,2,3])
def fixture_param(request):
    request.param
    print("\033[31;1m我是fixture_param,這是第%s次打印\033[0m"%request.param)
    return request.param

def test_fixture_param(fixture_param):
    print("我是test_fixture_param函數")
    # print("我fixture_param現在是:%s"%fixture_param)


if __name__ == '__main__':
    pytest.main(["-s",'test_fixture_params.py'])

結果


輸出的結果是這樣的
大家都知道,使用fixture函數有兩種方法

第一種是:直接將fixture函數的名字當做參數傳入

另一種是:使用裝飾器@pytest.mark.usefixtures("fixture函數名") 由於這種不能同過parametrize來傳參,這里不做贅述

實現方法二

通過@pytest.mark.parametrize來實現(只能實現第一種使用fixture的方法)

@pytest.fixture(params=[1,2,3])
def fixture_param(request):
    request.param
    print("\033[31;1m我是fixture_param,這是第%s次打印\033[0m"%request.param)
    return request.param

@pytest.mark.parametrize("fixture_param",["a","b"],indirect=True)
@pytest.mark.parametrize("a,b",[(1,6),(2,7),(3,8),(4,9)])
def test_fixture_param_and_parametrize(a,b,fixture_param):
    print("我是測試函數test_fixture_param_and_parametrize,參數a是%s,b是%s"%(a,b))
    # print("我fixture_param現在是:%s"%fixture_param)


if __name__ == '__main__':
    pytest.main(["-s",'test_fixture_params.py'])

注意:這個參數indirect=True,一定不能少,要不就會直接把 fixture_param當成測試函數的一個參數來用,加上indirect=True這個參數,才會在fixture的函數中查找

結果


結果是這樣子的,從圖中我們可以就看到,fixture中的params參數在這個test_fixture_param_and_parametrize函數中被覆蓋了,而且不影響它在別的函數中的使用

剛剛,還想到了裝飾器執行順序的問題,不顧好像對於參數化測試沒多大影響,反正執行結果都是 ?*?的都執行到了
可能,在功能開發過程中,需要用到這個順序

執行順序

fixture的執行順序

上圖就好了

調整一下上下和左右順序

以上是執行結果

可以看出越接近函數名的裝飾器或者參數,越早執行,好了,姑且這樣子,反正我懂了

parametrize執行順序

上圖就好了

上圖可以看出,越遠的裝飾器,越早遍歷完*,可以看做下圖

加上參數化fixture也是一樣


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM