『德不孤』Pytest框架 — 15、Pytest引數化

繁華似錦Fighting發表於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引數中定義的資訊。

"""

相關文章