• 接口自动化参数化(二)


    parameterized参数详解(转载)

    # test_math.py
    from nose.tools import assert_equal
    from parameterized import parameterized
    
    import unittest
    import math
    
    @parameterized([
        (2, 2, 4),
        (2, 3, 8),
        (1, 9, 1),
        (0, 9, 0),
    ])
    def test_pow(base, exponent, expected):
        assert_equal(math.pow(base, exponent), expected)
    
    class TestMathUnitTest(unittest.TestCase):
        @parameterized.expand([
            ("negative", -1.5, -2.0),
            ("integer", 1, 1.0),
            ("large fraction", 1.6, 1),
        ])
        def test_floor(self, name, input, expected):
            assert_equal(math.floor(input), expected)
    
    在 nose (and nose2)下运行:
    
    $ nosetests -v test_math.py
    test_math.test_pow(2, 2, 4) ... ok
    test_math.test_pow(2, 3, 8) ... ok
    test_math.test_pow(1, 9, 1) ... ok
    test_math.test_pow(0, 9, 0) ... ok
    test_floor_0_negative (test_math.TestMathUnitTest) ... ok
    test_floor_1_integer (test_math.TestMathUnitTest) ... ok
    test_floor_2_large_fraction (test_math.TestMathUnitTest) ... ok
    
    ----------------------------------------------------------------------
    Ran 7 tests in 0.002s
    
    OK
    As the package name suggests, nose is best supported and will be used for all further examples.
    
    With py.test (version 2.0 and above):
    
    $ py.test -v test_math.py
    ============================== test session starts ==============================
    platform darwin -- Python 2.7.2 -- py-1.4.30 -- pytest-2.7.1
    collected 7 items
    
    test_math.py::test_pow::[0] PASSED
    test_math.py::test_pow::[1] PASSED
    test_math.py::test_pow::[2] PASSED
    test_math.py::test_pow::[3] PASSED
    test_math.py::TestMathUnitTest::test_floor_0_negative
    test_math.py::TestMathUnitTest::test_floor_1_integer
    test_math.py::TestMathUnitTest::test_floor_2_large_fraction
    
    =========================== 7 passed in 0.10 seconds ============================
    With unittest (and unittest2):
    
    $ python -m unittest -v test_math
    test_floor_0_negative (test_math.TestMathUnitTest) ... ok
    test_floor_1_integer (test_math.TestMathUnitTest) ... ok
    test_floor_2_large_fraction (test_math.TestMathUnitTest) ... ok
    
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    OK
    (note: because unittest does not support test decorators, only tests created with @parameterized.expand will be executed)

    在@parameterized与@parameterized.expand装饰接受列表或可迭代的元组或param(...),或调用它返回一个列表或可迭代, 下面是比较全的使用方法示例:

    from parameterized import parameterized, param
    
    # A list of tuples
    @parameterized([
        (2, 3, 5),
        (3, 5, 8),
    ])
    def test_add(a, b, expected):
        assert_equal(a + b, expected)
    
    # A list of params
    @parameterized([
        param("10", 10),
        param("10", 16, base=16),
    ])
    def test_int(str_val, expected, base=10):
        assert_equal(int(str_val, base=base), expected)
    
    # An iterable of params
    @parameterized(
        param.explicit(*json.loads(line))
        for line in open("testcases.jsons")
    )
    def test_from_json_file(...):
        ...
    
    # A callable which returns a list of tuples
    def load_test_cases():
        return [
            ("test1", ),
            ("test2", ),
        ]
    @parameterized(load_test_cases)
    def test_from_function(name):
        ...

    请注意,在使用迭代器或生成器时,在开始测试运行之前,所有项目都将被加载到内存中(我们明确地做到这一点,以确保生成器在多进程或多线程测试环境中精确地耗尽一次) 。

    @parameterized装饰可用于测试类的方法,和独立的功能:

    from parameterized import parameterized
    
    class AddTest(object):
        @parameterized([
            (2, 3, 5),
        ])
        def test_add(self, a, b, expected):
            assert_equal(a + b, expected)
    
    @parameterized([
        (2, 3, 5),
    ])
    def test_add(a, b, expected):
        assert_equal(a + b, expected)

    并且@parameterized.expand可以用于在不能使用测试生成器的情况下生成测试方法(例如,当测试类是子类时unittest.TestCase):

    import unittest
    from parameterized import parameterized
    
    class AddTestCase(unittest.TestCase):
        @parameterized.expand([
            ("2 and 3", 2, 3, 5),
            ("3 and 5", 2, 3, 5),
        ])
        def test_add(self, _, a, b, expected):
            assert_equal(a + b, expected)

    会创建测试用例:

    $ nosetests example.py
    test_add_0_2_and_3 (example.AddTestCase) ... ok
    test_add_1_3_and_5 (example.AddTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    OK

    请注意,@parameterized.expand通过在测试类上创建新方法。如果第一个参数是一个字符串,该字符串将被添加到方法名称的末尾。例如,上面的测试用例会生成方法 test_add_0_2_and_3test_add_1_3_and_5

    生成的测试用例的名称@parameterized.expand可以使用testcase_func_namekeyword参数自定义。该值应该是这三个参数的函数:testcase_funcparam_num,和params,应该返回测试用例的名字。 testcase_func将被测试的功能,param_num将参数列表中的测试用例参数的索引,和param (一个实例param)将被使用的参数。

    import unittest
    from parameterized import parameterized
    
    def custom_name_func(testcase_func, param_num, param):
        return "%s_%s" %(
            testcase_func.__name__,
            parameterized.to_safe_name("_".join(str(x) for x in param.args)),
        )
    
    class AddTestCase(unittest.TestCase):
        @parameterized.expand([
            (2, 3, 5),
            (2, 3, 5),
        ], testcase_func_name=custom_name_func)
        def test_add(self, a, b, expected):
            assert_equal(a + b, expected)

    创建测试用例:

    $ nosetests example.py
    test_add_1_2_3 (example.AddTestCase) ... ok
    test_add_2_3_5 (example.AddTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    OK

    param(...)助手类存储一个特定的测试情况的参数。它可以用于将关键字参数传递给测试用例:

    from parameterized import parameterized, param
    
    @parameterized([
        param("10", 10),
        param("10", 16, base=16),
    ])
    def test_int(str_val, expected, base=10):
        assert_equal(int(str_val, base=base), expected)
    

    如果测试用例有一个docstring,则该测试用例的参数将追加到docstring的第一行。这个行为可以用doc_func参数控制:

    from parameterized import parameterized
    
    @parameterized([
        (1, 2, 3),
        (4, 5, 9),
    ])
    def test_add(a, b, expected):
        """ Test addition. """
        assert_equal(a + b, expected)
    
    def my_doc_func(func, num, param):
        return "%s: %s with %s" %(num, func.__name__, param)
    
    @parameterized([
        (5, 4, 1),
        (9, 6, 3),
    ], doc_func=my_doc_func)
    def test_subtraction(a, b, expected):
        assert_equal(a - b, expected)
    $ nosetests example.py
    Test addition. [with a=1, b=2, expected=3] ... ok
    Test addition. [with a=4, b=5, expected=9] ... ok
    0: test_subtraction with param(*(5, 4, 1)) ... ok
    1: test_subtraction with param(*(9, 6, 3)) ... ok
    
    ----------------------------------------------------------------------
    Ran 4 tests in 0.001s
    
    OK

    原版博客链接:

    http://www.cnblogs.com/itstu/p/6955296.html

    (只为了自己看的时候方便进行转载)

  • 相关阅读:
    操作系统Cosmos hal 层的函数调用思维导图
    软件测试 性能测试报告jmeter性能测试
    进程调度模拟算法
    软件测试 性能测试报告
    论软件的系统测试及其应用
    QTP实验
    论MVC架构设计及其应用
    存储管理动态分区分配及回收算法
    浅谈高并发、高性能、高可用
    实验二白盒测试
  • 原文地址:https://www.cnblogs.com/wbw-test/p/10522058.html
Copyright © 2020-2023  润新知