pytest實現測試用例引數化

2022-10-03 16:33:09 字數 4722 閱讀 3989

本文總www.cppcns.com結pytest的測試用例引數化。

軟體測試中,輸入相應值,檢查期望值,是常見測試方法。

在自動化測試中,乙個測試用例對應乙個測試點,通常一組測試資料無法完全覆蓋測試範圍,所以,需要引數化來傳遞多組資料。

pytest的測試用例引數化使用如下裝飾器即可完成。

@pytest.mark.parametrize(argnames, ar**alues)

# 引數:

# argnames:以逗號分隔的字串

# ar**aluse: 引數值列表,若有多個引數,一組引數以元組形式存在,包含多組引數的所有引數

# 以元組列表形式存在

示例:引數化之乙個引數。

# ./test_case/test_func.py

import pytest

@pytest.mark.parametrize("arg_1", [4399, 2012])

def test_add_by_func_aaa(arg_1):

print(arg_1)

# ./run_test.py

import pytest

if __name__ == '__main__':

pytest.main(['-v','-s'])

'''*************************==== test session starts *************************====

platform win32 -- python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- d:\python3.7\python.exe

cachedir: .p程式設計客棧ytest_cache

rootdir: d:\python3.7\project\pytest, inifile: pytest.ini

plugins: allure-pytest-2.8.9, rerunfailures-8.0

collecting ... collected 2 items

test_case/test_func.py::test_add_by_func_aaa[4399] 4399

passed

test_case/test_func.py::test_add_by_func_aaa[2012] 2012

passed

****************************** 2 passed in 0.04s ******************************

[finished in 1.3s]

'''引數化之多個引數。

# ./test_case/test_func.py

import pytest

@pytest.mark.parametrize("arg_1, arg_2", [(4399, 'aaaa'), (2012, 'bbbb')])

def test_add_by_func_aaa(arg_1,arg_2):

print("arg_1:{} arg_2:{}".format(arg_1, arg_2))

# ./run_test.py

import pytest

if __name__ == '__main__':

pytest.main(['-v','-s'])

'''*************************==== test session starts *************************====

platform win32 -- python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- d:\python3.7\python.exe

cachedir: .pytest_cache

rootdir: d:\python3.7\project\pytest, inifile: pytest.ini

plugins: allure-pytest-2.8.9, rerunfailures-8.0

collecting ... collected 2 items

test_case/test_func.py::test_add_by_func_aaa[4399-aaaa] arg_1:4399 arg_2:aaaa

passed

test_case/test_func.py::test_add_by_func_aaa[2012-bbbb] arg_1:2012 arg_2:bbbb

passed

****************************** 2 passed in 0.05s ******************************

[finished in 1.3s]

'''以上第2個示例,展現的是乙個測試用例有兩個引數,然後引數化了兩組資料。

但在實際測試中,有的場景,比如多條件查詢,比如有2個查詢條件,每個條件有3個選項,如果要全部覆蓋,則是3*3==9種情況。這種情景,人工測試一般是不會全部覆蓋的,但在自動化測試中,只要你想,就可以做到。如下示例:

如下格式引數化,其測試結果為所有引數選項數量的乘積。

# ./test_case/test_func.py

import pytest

from func import *

'''class testfunc:

# 正常測試用例

def test_add_by_class(self):

assert add(2,3) == 5

def test_add_by_class_11(self):

assert add(2,3) == 5

'''

@pytest.mark.parametri程式設計客棧ze("arg_1", [439www.cppcns.com9, 2012, 1997])

@pytest.mark.parametrize("arg_2", ['aaaa', 'bbbb', 'cccc'])

def test_add_by_func_aaa(arg_1,arg_2):

print("arg_1:{} arg_2:{}".format(arg_1, arg_2))

# ./run_test.py

import pytest

if __name__ == '__main__':

pytest.main(['-v','-s'])

'''*************************==== test session starts *************************====

platform win32 -- python 3.7.0, pytest-5.3.4, py-1.8.1, pluggy-0.13.1 -- d:\python3.7\python.exe

cachedir: .pytest_cache

rootdir: d:\python3.7\project\pytest, inifile: pytest.ini

plugins: allure-pytest-2.8.9, rerunfailures-8.0

collecting ... collected 9 items

test_case/test_func.py::test_add_by_func_aaa[aaaa-4399] arg_1:4399 arg_2:aaaa

passed

test_case/test_func.py::test_add_by_func_aaa[aaaa-2012] arg_1:2012 arg_2:aaaa

passed

test_case/test_func.py::test_add_by_func_aaa[aaaa-1997] arg_1:1997 arg_2:aaaa

passed

test_case/test_func.py::test_add_by_func_aaa[bbbb-4399] arg_1:4399 arg_2:bbbb

passed

test_case/test_func.py::test_add_by_func_aaa[bbbb-2012] arg_1:2012 arg_2:bbbb

passed

test_case/test_func.py::test_add_程式設計客棧by_func_aaa[bbbb-1997] arg_1:1997 arg_2:bbbb

passed

test_case/test_func.py::test_add_by_func_aaa[cccc-4399] arg_1:4399 arg_2:cccc

passed

test_case/test_func.py::test_add_by_func_aaa[cccc-2012] arg_1:2012 arg_2:cccc

passed

test_case/test_func.py::test_add_by_func_aaa[cccc-1997] arg_1:1997 arg_2:cccc

passed

****************************** 9 passed in 0.06s ******************************

[finished in 1.4s]

'''以上,就是我們測試中使用的pytest測試用例引數化。

當然,如實際需要,你也可以把測試資料獨立到檔案裡。然後讀取出來,傳遞給@pytest.mark.parametrize(argnames, ar**alues)裝飾器

pytest引數化自定義測試用例標題

pytest使用裝飾器 pytest.mark.parametrize進行引數化後,在控制台或者測試報告中的測試用例標題都是以引數組合起來命名的,這樣的標題看起來不太直觀,我們想要展示我們自己定義的標題,這時候需要用到裝飾器 pytest.mark.parametrize引數化的另外乙個引數ids來...

PYTEST中對測試用例標記執行

標記三種方式 1 顯式指定函式名,通過 標記 pytest test.py test012 模糊查詢,使用 k標識 pytest k test test.py3 使用pytest.mark在函式上標記 建立pytest.ini檔案 注意縮排 pytest markers do do undo und...

Pytest 測試用例的執行方式(2)

在pytest框架中,編寫測試用例有如下約束 在滿足上面約束後,有兩種方式來執行測試用例 主函式方式 命令列方式 使用pytest.main 方式執行用例,如果不加引數,會自動從當前目錄及子目錄中尋找符合上述約束的測試用例來執行。import pytest class testpractice de...