python pytest學習(十)函式傳參

2022-07-16 22:15:28 字數 4403 閱讀 9119

一、前言

為了提高**的復用性,我們在寫用例的時候,會用到函式,然後不同的用例去呼叫這個函式。

比如登入操作,大部分用例都會先登入,那就需要把登入單獨抽出來寫乙個函式,其他用例全部都呼叫這個登入函式就行。

但是登入的賬號不能寫死,有時候我想用賬號1去登入,執行用例1,用賬號2去登入執行用例2,所以需要對函式傳參。

二、登入函式傳參

把登入單獨成立,寫乙個函式,傳2個引數user和psw,寫用例的時候呼叫登入函式,輸入幾組user,psw引數化登入用例。

測試用例傳參需要用裝飾器@pytest.mark.parametrize,裡面寫兩個引數。

第乙個引數是字串,多個引數中間用逗號隔開;

第二個引數是list,多組資料用元組型別。

import

pytest

#測試登入資料

test_login_data = [("

admin

","111111

"),("

admin

",""

)]def

login(user,psw):

"""普通登入函式

"""print("

登入賬號:%s

"%user)

print("

登入密碼:%s

"%psw)

ifpsw:

return

true

else

:

return

false

@pytest.mark.parametrize(

"user,psw

",test_login_data)

deftest_login(user,psw):

"""登入用例

"""result =login(user,psw)

assert result == true,"

失敗原因:密碼為空"if

__name__ == "

__main__":

pytest.main(["-s

","test_login.py

"])

執行結果:

三、request引數

如果想把登入插座放在前置操作裡,也就是用到@pytest.fixture裝飾器,傳參就用預設的request引數。

user = request.param這一步是接收傳入的引數,本案例是傳乙個引數情況。

import

pytest

#測試賬號資料

test_user_data = ["

admin1

","admin2"]

@pytest.fixture(scope="

module")

deflogin(request):

user =request.param

print("

登入賬號:%s

"%user)

return

user

@pytest.mark.parametrize(

"login

",test_user_data,indirect=true)

deftest_login(login):

"""登入用例

"""a =login

print("

測試用例中login的返回值:%s

"%a)

assert a != ""

if__name__ == "

__main__":

pytest.main(["-s

","test_login2.py

"])

執行結果:

新增indirect = true引數是為了把login當成乙個函式去執行,而不是乙個引數。

四、request傳兩個引數

如果用到@pytest.fixture,裡面用2個引數情況,可以把多個引數用乙個欄位去儲存,這樣最終還只傳乙個引數。

不同的引數再從字典裡面取對應key值就行,如:user = request.param["user"]

import

pytest

#測試賬號資料

test_user_data = [,

]@pytest.fixture(scope="

module")

deflogin(request):

user = request.param["

user"]

psw = request.param["

psw"

]

print("

登入使用者:%s

"%user)

print("

登入密碼:%s

"%psw)

ifpsw:

return

true

else

:

return

false

#indirect = true 宣告login是個函式

@pytest.mark.parametrize("

login

",test_user_data,indirect=true)

deftest_login(login):

"""登入用例

"""a =login

print("

測試用例中login的返回值:%s

"%a)

assert a,"

失敗原因:密碼為空"if

__name__=="

__main__":

pytest.main(["-s

","test_login3.py

"])

執行結果:

e assertionerror: 失敗原因:密碼為空

e assert false

如果要用到login裡面的返回值,def test_login(login)時,傳入login引數,函式返回值就是login了。

五、多個fixture

用例上面是可以同時放多個fixture的,也就是多個前置操作,可以支援修飾器疊加,使用parametrize裝飾器疊加時,用例組合是2個引數個數相乘。

import

pytest

#測試賬號資料

test_user = ["

admin1

","admin2"]

test_psw = ["

111111

","222222"]

@pytest.fixture(scope="

module")

definput_user(request):

user =request.param

print("

登入使用者:%s

"%user)

return

user

@pytest.fixture(scope="

module")

definput_psw(request):

psw =request.param

print("

登入密碼:%s

"%psw)

return

[email protected](

"input_user

",test_user,indirect=true)

@pytest.mark.parametrize(

"input_psw

",test_psw,indirect=true)

deftest_login(input_user,input_psw):

"""登入用例

"""a =input_user

b =input_psw

print("

測試資料a-> %s,b-> %s

"%(a,b))

assertbif

__name__=="

__main__":

pytest.main(["-s

","test_login4.py

"])

執行結果:

如果引數user有2個資料,引數psw有2個資料,那麼組合起來的案例是兩個相乘,也就是組合2*2=4個用例。

參考文章:

Python pytest測試框架基本用法(一)

一 框架介紹及安裝 pytest是python的一種單元測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,效率更高。安裝 pip install pytest 我這裡已經安裝成功了 二 框架使用流程 建立如下的原始碼檔案test one.py de...

python pytest測試框架介紹三

之前介紹了pytest以xunit形式來寫用例,下面來介紹pytest特有的方式來寫用例 如下 這裡使用的了pytest的特有的模式來寫用例,使用的方式是scope方式,scope支援多種,後面會介紹 這裡還使用了pytest的addfinalizer內建功能,具體可參見官網,用處是 在最後乙個測試...

Python Pytest框架(三)測試韌體 下

一 執行命令pytest fixture 可以列出當前所有可用的fixture,包括內建的 外掛程式中的 以及當前專案定義的。eg conftest.py和test 1.py在同一目錄下,要使用測試韌體login。conftest.py import pytest pytest.fixture de...