之前看到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也是一樣