天天看點

【pytest】paramtrize 參數化、資料驅動paramtrize 參數化:

paramtrize 參數化:

pytest 中可以使用 @pytest.mak.paramtrize(argsnames, argsvalues, ids=None) 來實作參數化;

主要參數說明:

  • argsnames :參數名,是個字元串,如中間用逗号分隔則表示為多個參數名;
  • argsvalues :參數值,參數組成的清單,清單中有幾個元素,就會生成幾條測試用例;

使用方法:

  1. 使用 @pytest.mak.paramtrize() 裝飾測試方法;
  2. parametrize('data', param) 中的 ‘data’ 是自定義的參數名,param 是引入的參數清單;
  3. 将自定義的參數名 data 作為參數傳給測試用例 test_func;
  4. 然後就可以在測試用例内部使用 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] 
           

繼續閱讀