中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的pytest參數化實例分析

發布時間:2022-01-07 17:45:41 來源:億速云 閱讀:132 作者:iii 欄目:開發技術

今天小編給大家分享一下Python的pytest參數化實例分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    源代碼分析

    def parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None):    
      """ Add new invocations to the underlying test function using the list    
        of argvalues for the given argnames.  Parametrization is performed
          during the collection phase.  If you need to setup expensive resources
        see about setting indirect to do it rather at test setup time.  # 使用給定argnames的argValue列表向基礎測試函數添加新的調用,在收集階段執行參數化。
    
        :arg argnames: a comma-separated string denoting one or more argument
                       names, or a list/tuple of argument strings.  # 參數名:使用逗號分隔的字符串,列表或元祖,表示一個或多個參數名
    
        :arg argvalues: The list of argvalues determines how often a
            test is invoked with different argument values.  If only one
            argname was specified argvalues is a list of values.  If N
            argnames were specified, argvalues must be a list of N-tuples,
            where each tuple-element specifies a value for its respective
            argname.  # 參數值:只有一個argnames,argvalues則是值列表。有N個argnames時,每個元祖對應一組argnames,所有元祖組合成一個列表
    
        :arg indirect: The list of argnames or boolean. A list of arguments'
            names (self,subset of argnames). If True the list contains all names from
            the argnames. Each argvalue corresponding to an argname in this list will
            be passed as request.param to its respective argname fixture
            function so that it can perform more expensive setups during the
            setup phase of a test rather than at collection time.
    
        :arg ids: list of string ids, or a callable.
            If strings, each is corresponding to the argvalues so that they are
            part of the test id. If None is given as id of specific test, the
            automatically generated id for that argument will be used.
            If callable, it should take one argument (self,a single argvalue) and return
            a string or return None. If None, the automatically generated id for that
            argument will be used.
            If no ids are provided they will be generated automatically from
            the argvalues.  # ids:字符串列表,可以理解成標題,與用例個數保持一致
    
        :arg scope: if specified it denotes the scope of the parameters.
            The scope is used for grouping tests by parameter instances.
            It will also override any fixture-function defined scope, allowing
            to set a dynamic scope using test context or configuration.  
      # 如果指定,則表示參數的范圍。作用域用于按參數實例對測試進行分組。
       它還將覆蓋任何fixture函數定義的范圍,允許使用測試上下文或配置設置動態范圍。
        """

    argnames

    釋義:參數名稱

    格式:字符串"arg1,arg2,arg3"

    aegvalues

    釋義:參數值列表

    格式:必須是列表,如[val1,val2,val3]

    單個參數,里面是值的列表,如@pytest.mark.parametrize("name",["Jack","Locus","Bill"])

    多個參數,需要用元祖來存放值,一個元祖對應一組參數的值,如@pytest.mark.parametrize("user,age",[("user1",15),("user2",24),("user3",25)])

    ids

    釋義:可以理解為用例的id

    格式:字符串列表,如["case1","case2","case3"]

    indirect

    釋義:當indirect=True時,若傳入的argnames是fixture函數名,此時fixture函數名將成為一個可執行的函數,

    argvalues作為fixture的參數,執行fixture函數,最終結果再存入 request.param;當indirect=False時,fixture

    函數只作為一個參數名給測試收集階段調用。

    備注:這里可以將the setup phase(測試設置階段)理解為配置 conftest.py 階段,將the collection phase(

    測試收集階段)理解為用例執行階段。

    裝飾測試類

    import pytest
    
    
    data = [
        (2,2,4),
        (3,4,12)
    ]
    
    def add(a,b):
        return a * b
    
    @pytest.mark.parametrize('a,b,expect',data)
    class TestParametrize(object):
        def test_parametrize_1(self,a,b,expect):
            print('\n測試函數1測試數據為\n{}-{}'.format(a,b))
            assert add(a,b) == expect
    
        def test_parametrize_2(self,a,b,expect):
            print('\n測試函數2測試數據為\n{}-{}'.format(a,b))
            assert add(a,b) == expect
    
    if __name__ == "__main__":
        pytest.main(["-s","test_07.py"])
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
    rootdir: D:\AutoCode
    plugins: html-3.1.1, metadata-1.11.0
    collecting ... collected 4 items
    
    test_07.py::TestParametrize::test_parametrize_1[2-2-4] 
    測試函數1測試數據為
    2-2
    PASSED
    test_07.py::TestParametrize::test_parametrize_1[3-4-12] 
    測試函數1測試數據為
    3-4
    PASSED
    test_07.py::TestParametrize::test_parametrize_2[2-2-4] 
    測試函數2測試數據為
    2-2
    PASSED
    test_07.py::TestParametrize::test_parametrize_2[3-4-12] 
    測試函數2測試數據為
    3-4
    PASSED
    
    ============================== 4 passed in 0.12s ==============================
    
    Process finished with exit code 0

    由以上代碼可以看到,當裝飾器裝飾測試類時,定義的數據集合會被傳遞給類的所有方法。

    裝飾測試函數

    單個數據

    import pytest
    
    
    data = ["Rose","white"]
    
    @pytest.mark.parametrize("name",data)
    def test_parametrize(name):
        print('\n列表中的名字為\n{}'.format(name))
    
    if __name__ == "__main__":
        pytest.main(["-s","test_07.py"])
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
    rootdir: D:\AutoCode
    plugins: html-3.1.1, metadata-1.11.0
    collected 2 items
    
    test_07.py 
    列表中的名字為
    Rose
    .
    列表中的名字為
    white
    .
    
    ============================== 2 passed in 0.09s ==============================
    
    Process finished with exit code 0

    當測試用例只需要一個參數時,我們存放數據的列表無序嵌套序列,@pytest.mark.parametrize("name", data)

    裝飾器的第一個參數也只需要一個變量接收列表中的每個元素,第二個參數傳遞存儲數據的列表,那么測試用

    例需要使用同名的字符串接收測試數據(實例中的name)且列表有多少個元素就會生成并執行多少個測試用例。

    一組數據

    import pytest
    
    
    data = [
        [1, 2, 3],
        [4, 5, 9]
    ]  # 列表嵌套列表
    # data_tuple = [
    #     (1, 2, 3),
    #     (4, 5, 9)
    # ]  # 列表嵌套元組
    
    
    @pytest.mark.parametrize('a, b, expect', data)
    def test_parametrize_1(a, b, expect):  # 一個參數接收一個數據
        print('\n測試數據為\n{},{},{}'.format(a, b, expect))
        actual = a + b
        assert actual == expect
    
    
    @pytest.mark.parametrize('value', data)
    def test_parametrize_2(value):  # 一個參數接收一組數據
        print('\n測試數據為\n{}'.format(value))
        actual = value[0] + value[1]
        assert actual == value[2]
    
    if __name__ == "__main__":
        pytest.main(["-s","test_07.py"])
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
    rootdir: D:\AutoCode
    plugins: html-3.1.1, metadata-1.11.0
    collected 4 items
    
    test_07.py 
    測試數據為
    1,2,3
    .
    測試數據為
    4,5,9
    .
    測試數據為
    [1, 2, 3]
    .
    測試數據為
    [4, 5, 9]
    .
    
    ============================== 4 passed in 0.09s ==============================
    
    Process finished with exit code 0

    當測試用例需要多個數據時,我們可以使用嵌套序列(嵌套元組&嵌套列表)的列表來存放測試數據。

    裝飾器@pytest.mark.parametrize()可以使用單個變量接收數據,也可以使用多個變量接收,同樣,測

    試用例函數也需要與其保持一致。

      當使用單個變量接收時,測試數據傳遞到測試函數內部時為列表中的每一個元素或者小列表,需

    要使用索引的方式取得每個數據。

      當使用多個變量接收數據時,那么每個變量分別接收小列表或元組中的每個元素列表嵌套多少個多

    組小列表或元組,測生成多少條測試用例。

    組合數據

    import pytest
    
    
    data_1 = [1,2,3]
    data_2 = ['a','b']
    
    @pytest.mark.parametrize('a',data_1)
    @pytest.mark.parametrize('b',data_2)
    def test_parametrize_1(a,b):
        print(f'笛卡爾積測試結果為:{a},{b}')
    
    if __name__ == '__main__':
        pytest.main(["-vs","test_06.py"])

    Python的pytest參數化實例分析

    通過測試結果,我們不難分析,一個測試函數還可以同時被多個參數化裝飾器裝飾,那么多個

    裝飾器中的數據會進行交叉組合的方式傳遞給測試函數,進而生成n * n個測試用例。

    標記用例

    import pytest
    
    @pytest.mark.parametrize("test_input,expected",[
        ("3+5",8),
        ("2+4",6),
        pytest.param("6 * 9",42,marks=pytest.mark.xfail),
        pytest.param("6 * 6",42,marks=pytest.mark.skip)
    ])
    
    def test_mark(test_input,expected):
        assert eval(test_input) == expected
    
    if __name__ == '__main__':
        pytest.main(["-vs","test_06.py"])

    Python的pytest參數化實例分析

    輸出結果顯示收集到4個用例,兩個通過,一個被跳過,一個標記失敗,當我們不想執行某組測試

    數據時,我們可以標記skip或skipif;當我們預期某組數據會執行失敗時,我們可以標記為xfail等。

    嵌套字典

    import pytest
    
    
    data = (
        {
            'user': "name1",
            'pwd': 123
        },
        {
            'user': "name2",
            'pwd': 456
        }
    )
    
    @pytest.mark.parametrize('dic',data)
    def test_parametrize(dic):
        print('\n測試數據為\n{}'.format(dic))
    
    if __name__ == '__main__':
        pytest.main(["-vs","test_06.py"])

    Python的pytest參數化實例分析

    增加測試結果可讀性

    參數化裝飾器有一個額外的參數ids,可以標識每一個測試用例,自定義測試數據結果的顯示,

    為了增加可讀性,我們可以標記每一個測試用例使用的測試數據是什么,適當的增加一些說明。

    在使用前你需要知道,ids參數應該是一個字符串列表,必須和數據對象列表的長度保持一致。

    import pytest
    
    
    data_1 = [
        (1, 2, 3),
        (4, 5, 9)
    ]
    
    ids = ["a:{} + b:{} = expect:{}".format(a, b, expect) for a, b, expect in data_1]
    
    def add(a, b):
        return a + b
    
    @pytest.mark.parametrize('a, b, expect', data_1, ids=ids)
    class TestParametrize(object):
    
        def test_parametrize_1(self, a, b, expect):
            print('\n測試函數1測試數據為\n{}-{}'.format(a, b))
            assert add(a, b) == expect
    
        def test_parametrize_2(self, a, b, expect):
            print('\n測試函數2數據為\n{}-{}'.format(a, b))
            assert add(a, b) == expect
    
    if __name__ == '__main__':
        pytest.main(["-v","test_06.py"])

    不加ids參數的返回結果

    Python的pytest參數化實例分析

    加ids參數的返回結果

    Python的pytest參數化實例分析

    我們可以看到帶ids參數的返回結果中的用例都被一個列表明確的標記了,而且通過這種標記

    可以更加直觀的看出來,每個測試用例使用的數據名稱及測試內容。

    以上就是“Python的pytest參數化實例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    通城县| 瑞安市| 兴城市| 呼和浩特市| 济源市| 新田县| 弋阳县| 汉沽区| 柳江县| 平泉县| 台前县| 清苑县| 郑州市| 白河县| 建阳市| 盐池县| 望奎县| 江永县| 澄迈县| 会昌县| 电白县| 凤山市| 台南县| 永宁县| 汉源县| 昭觉县| 姚安县| 永善县| 广南县| 赫章县| 驻马店市| 龙口市| 遂平县| 张家港市| 车致| 巴里| 和林格尔县| 岳普湖县| 德阳市| 永州市| 临夏县|