paramtrize 參數化:
pytest 中可以使用 @pytest.mak.paramtrize(argsnames, argsvalues, ids=None) 來實作參數化;
主要參數說明:
- argsnames :參數名,是個字元串,如中間用逗号分隔則表示為多個參數名;
- argsvalues :參數值,參數組成的清單,清單中有幾個元素,就會生成幾條測試用例;
使用方法:
- 使用 @pytest.mak.paramtrize() 裝飾測試方法;
- parametrize('data', param) 中的 ‘data’ 是自定義的參數名,param 是引入的參數清單;
- 将自定義的參數名 data 作為參數傳給測試用例 test_func;
- 然後就可以在測試用例内部使用 data 的參數了;
整個過程中,pytest 将參數清單 [1, 2, 3] 中的 3 個元素取出來,用每個元素生成 1 條測試用例,并且将元素指派給 data 作為測試用例的參數,由測試用例自由使用;
# test_moduleName.py
import pytest
class TestClass_1:
"""測試類1"""
param = [1, 2, 3]
# 'data' :自定義的參數名
# param :參數清單
@pytest.mark.parametrize('data', param)
def test_func(self, data): # 将參數名作為測試方法的參數
"""測試方法"""
print('\n參數:', data) # 實際得到的參數
# 執行結果:
============================= test session starts =============================
test_moduleName.py::TestClass_1::test_func[1]
參數:data = 1
PASSED
test_moduleName.py::TestClass_1::test_func[2]
參數:data = 2
PASSED
test_moduleName.py::TestClass_1::test_func[3]
參數:data = 3
PASSED
============================== 3 passed in 0.03s ==============================
Process finished with exit code 0
多個參數名的用法:
前面講了參數名可以就用逗号分隔,表示為多個參數名,當使用多個參數名時要注意,參數清單中的元素必須是可拆包的數組,并且數組内的元素數必須和參數名的數量相同;
# test_moduleName.py
import pytest
class TestClass_1:
"""測試類1"""
param = [('admin1', 'pwd001'), ('admin2', 'pwd002'), ('admin3', 'pwd003')]
# 因為參數名是 2 個,是以清單的每個元素都必須是長度為 2 的數組;
@pytest.mark.parametrize('uname, pwd', param)
def test_func(self, uname, pwd):
"""測試方法"""
print('\n參數:uname = ', uname)
print('參數:pwd = ', pwd)
# 執行結果
============================= test session starts =============================
test_moduleName.py::TestClass_1::test_func[admin1-pwd001]
參數:uname = admin1
參數:pwd = pwd001
PASSED
test_moduleName.py::TestClass_1::test_func[admin2-pwd002]
參數:uname = admin2
參數:pwd = pwd002
PASSED
test_moduleName.py::TestClass_1::test_func[admin3-pwd003]
參數:uname = admin3
參數:pwd = pwd003
PASSED
============================== 3 passed in 0.02s ==============================
多次使用 paramtrize :
同一個測試用例還可以同時适用多個 @pytest.mak.paramtrize(),多個 paramtrize 的所有元素互相組合(類似笛卡兒乘積)生成大量測試用例;
# test_moduleName.py
import pytest
class TestClass_1:
"""測試類1"""
@pytest.mark.parametrize('date3', ['value3-1', 'value3-2', 'value3-3'])
@pytest.mark.parametrize('date2', ['value2-1', 'value2-2', 'value2-3'])
@pytest.mark.parametrize('date1', ['value1-1', 'value1-2', 'value1-3'])
def test_func(self, date1, date2, date3):
"""測試方法"""
print('\n參數:date1 = ', date1)
print('參數:date2 = ', date2)
print('參數:date3 = ', date3)
如下所示,3 個 paramtrize() ,共有 3 * 3 * 3 = 27 種組合,pytest 便會生成 27 條測試用例!
test_moduleName.py::TestClass_1::test_func[value1.1-value2.1-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.1-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.1-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.2-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.2-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.2-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.3-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.3-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.1-value2.3-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.1-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.1-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.1-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.2-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.2-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.2-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.3-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.3-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.2-value2.3-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.1-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.1-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.1-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.2-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.2-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.2-value3.3]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.3-value3.1]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.3-value3.2]
test_moduleName.py::TestClass_1::test_func[value1.3-value2.3-value3.3]