『德不孤』Pytest框架 — 15、Pytest引數化
阿新 • • 發佈:2022-03-20
目錄
1、Pytest引數化說明
軟體測試中,輸入相應值,檢查期望值,是常見測試方法。
在自動化測試中,一個測試用例對應一個測試點,通常一組測試資料是無法完全覆蓋測試範圍的,所以需要引數化來傳遞多組資料。
Unittest
單元測試框架使用DDT進行資料驅動測試,Pytest是使用@pytest.mark.parametrize
裝飾器來實現資料驅動測試的。
2、Pytest引數化方式
Pytest有三種傳參方式,主要用到前兩種
-
@pytest.mark.parametrize()
裝飾器方式進行引數化。(常用) -
pytest.fixture()
方式進行引數化,fixture
裝飾的函式可以作為引數傳入其他函式。 -
conftest.py
檔案中存放參數化函式,可作用於模組內的所有測試用例。
這裡只說明第一種引數化方式。
3、parametrize裝飾器引數說明
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
說明:
-
argnames
:引數名,使用逗號分隔的字串,或列表或元祖,表示一個或多個引數名。(常用引數) -
argvalues
-
indirect
:當indirect=True
時,若傳入的argnames
(引數)是Fixture函式名,此時Fixture函式名將是一個可執行的函式,Fixture裝飾器返回的資料作為argnames
的引數,最終結果會存入request.param
中。
當indirect=False
時,Fixture函式只作為一個引數名,給測試收集階段呼叫。
說明:結合Fixture裝飾器的內容一起看,就會明白上面說的是什麼意思。(這個引數不常用,預設即可) -
ids
:字串列表,可以理解成給前面的argvalues
-
scope
:如果指定,則表示引數的使用範圍。
作用域用於按引數例項對測試進行分組。(待理解)
它還將覆蓋任何Fixture函式定義的範圍。
允許使用測試上下文或配置設定動態範圍。(待理解)
(這個引數不常用,預設即可)
4、Pytest引數化(單個引數)
示例:
"""
1.學習目標
掌握pytest中引數化方法
2.操作步驟
parametrize(argnames,argvalues)
argnames 引數名稱
argvalues 引數值
@pytest.mark.parametrize()
3.單個引數使用
argnames 一定和測試用例中的引數名保持一致
argvalues 是一個列表格式
"""
import pytest
# 有幾個資料,用例就執行幾次。
data = ["13800138000", "13800138001", "13800138002"]
@pytest.mark.parametrize("phonenum", data)
def test_login(phonenum):
# test_login函式的引數phonenum,要和parametrize定義的引數phonenum一致。
print(f"輸入電話號碼{phonenum}")
if __name__ == '__main__':
pytest.main()
"""
執行結果:
test_01.py::test_login[13800138000] 輸入電話號碼13800138000
PASSED
test_01.py::test_login[13800138001] 輸入電話號碼13800138001
PASSED
test_01.py::test_login[13800138002] 輸入電話號碼13800138002
PASSED
我們可以看到用例執行了3次。
"""
5、Pytest引數化(多個引數)
示例:
"""
1.學習目標
掌握pytest中引數化方法
2.操作步驟
parametrize(argnames,argvalues)
argnames 引數名稱
argvalues 引數值
@pytest.mark.parametrize()
3.多個引數使用
argnames:字串格式,各個引數之間逗號隔開
argvalues: [(),(),()],列表巢狀元組,元組中元素的個數和引數個數一致
"""
import pytest
# 有幾個資料,用例就執行幾次。
data = [("13800138000", 1234), ("13800138001", 2345), ("13800138002", 3456)]
# "phonenum,code"引數名個數,要和列表中物件的引數個數一致。
@pytest.mark.parametrize("phonenum,code", data)
def test_login(phonenum, code):
print(f"輸入電話號碼{phonenum}")
print(f"輸入驗證碼{code}")
assert phonenum == "13800138000"
if __name__ == '__main__':
pytest.main()
"""
執行結果:
test_01.py::test_login[13800138000-1234] 輸入電話號碼13800138000
輸入驗證碼1234
PASSED
test_01.py::test_login[13800138001-2345] 輸入電話號碼13800138001
輸入驗證碼2345
FAILED
test_01.py::test_login[13800138002-3456] 輸入電話號碼13800138002
輸入驗證碼3456
FAILED
"""
6、ids引數說明
示例:
"""
import pytest
# 有幾個資料,用例就執行幾次。
data = [("13800138000", 1234), ("13800138001", 2345), ("13800138002", 3456)]
# "phonenum,code"引數名個數,要和列表中物件的引數個數一致。
@pytest.mark.parametrize("phonenum,code", data, ids=['333', '666', '999'])
def test_login(phonenum, code):
print(f"輸入電話號碼{phonenum}")
print(f"輸入驗證碼{code}")
if __name__ == '__main__':
pytest.main()
"""
執行結果:
test_01.py::test_login[333] 輸入電話號碼13800138000
輸入驗證碼1234
PASSED
test_01.py::test_login[666] 輸入電話號碼13800138001
輸入驗證碼2345
PASSED
test_01.py::test_login[999] 輸入電話號碼13800138002
輸入驗證碼3456
PASSED
請和上面的例子對比[]號中的資訊,就是在ids引數中定義的資訊。
"""