pytest.mark.parametrize裝飾器可以實現用例參數化
1.以下是一個實現檢查一定的輸入和期望輸出測試功能的典型例子
import pytest @pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42)]) def test_add(test_input,expected): assert eval(test_input) == expected
結果:成功2個失敗1個,但是需要注意的是,@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42)])里面的"test_input,expected"一定要和
test_add(test_input,expected)當中的參數名稱一致,否則,將會出錯。
============================= test session starts ==============================
platform darwin -- Python 2.7.10, pytest-3.6.3, py-1.5.2, pluggy-0.6.0
rootdir: /Users/newcomer/PycharmProjects/error/wuya/pytestDemo, inifile:
plugins: metadata-1.7.0, html-1.19.0, D3-2.0.13, cov-2.5.1, catchlog-1.2.2, allure-adaptor-1.7.10, georaven-17.1.0.170collected 3 items
parametrizing.py ..F
parametrizing.py:9 (test_add[6*9-42])
42 != 54
Expected :54
Actual :42
<Click to see difference>
test_input = '6*9', expected = 42
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42)])
def test_add(test_input,expected):
> assert eval(test_input) == expected
E AssertionError: assert 54 == 42
E + where 54 = eval('6*9')
parametrizing.py:12: AssertionError
[100%]
=================================== FAILURES ===================================
_______________________________ test_add[6*9-42] _______________________________
test_input = '6*9', expected = 42
@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",42)])
def test_add(test_input,expected):
> assert eval(test_input) == expected
E AssertionError: assert 54 == 42
E + where 54 = eval('6*9')
parametrizing.py:12: AssertionError
================ 1 failed, 2 passed, 1 warnings in 0.08 seconds ================
Process finished with exit code 0
2.它也可以標記單個測試實例在參數化,例如使用內置的mark.xfail
import pytest @pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), pytest.param("6 * 9",42,marks=pytest.mark.xfail),]) def test_eval(test_input, expected): print("-------開始用例------") assert eval(test_input) == expected
結果:可以看出來,標記為失敗的用例就不運行了,直接跳過顯示xfailed
============================= test session starts ==============================
platform darwin -- Python 2.7.10, pytest-3.6.3, py-1.5.2, pluggy-0.6.0
rootdir: /Users/newcomer/PycharmProjects/error/wuya/pytestDemo, inifile:
plugins: metadata-1.7.0, html-1.19.0, D3-2.0.13, cov-2.5.1, catchlog-1.2.2, allure-adaptor-1.7.10, georaven-17.1.0.170collected 3 items
parametrizing.py .-------開始用例------
.-------開始用例------
x-------開始用例------
test_input = '6 * 9', expected = 42
@pytest.mark.parametrize("test_input, expected", [
("3+5", 8),
("2+4", 6),
pytest.param("6 * 9",42,marks=pytest.mark.xfail),])
def test_eval(test_input, expected):
print("-------開始用例------")
> assert eval(test_input) == expected
E AssertionError: assert 54 == 42
E + where 54 = eval('6 * 9')
parametrizing.py:26: AssertionError
[100%]
=============== 2 passed, 1 xfailed in 0.08 seconds ================
Process finished with exit code 0
參數組合:
import pytest @pytest.mark.parametrize("x", [0, 1]) @pytest.mark.parametrize("y", [2, 3]) def test_foo(x, y): print("測試數據組合:x->%s, y->%s" % (x, y))
結果:
test_canshu1.py 測試數據組合:x->0, y->2
.測試數據組合:x->1, y->2
.測試數據組合:x->0, y->3
.測試數據組合:x->1, y->3 .
========================== 4 passed in 1.75 seconds ===========================
這將運行測試,參數設置為x=0/y=2,x=1/y=2,x=0/y=3,x=1/y=3組合參數。