一、前言
為了提高**的復用性,我們在寫用例的時候,會用到函式,然後不同的用例去呼叫這個函式。
比如登入操作,大部分用例都會先登入,那就需要把登入單獨抽出來寫乙個函式,其他用例全部都呼叫這個登入函式就行。
但是登入的賬號不能寫死,有時候我想用賬號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
"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...