python unittest参数化_<自动化测试>之<使用unittest Python测试框架进行参数化测试>...

最近在看视频时,虫师简单提到了简化自动化测试脚本用例中的代码量,而python中本身的参数化方法用来测试很糟糕,他在实际操作中使用了parameterized参数化...

有兴趣就查了下使用的方法,来分享给大家,使用Python测试框架进行参数化测试 下载安装https://github.com/wolever/parameterized或PIP install: $ pip install parameterized

parameterized了修正对于一切nose参数化测试,py.test参数化测试,单元测试参数化测试。

#test_math.py

from nose.tools importassert_equalfrom parameterized importparameterizedimportunittestimportmath

@parameterized([

(2, 2, 4),

(2, 3, 8),

(1, 9, 1),

(0,9, 0),

])deftest_pow(base, exponent, expected):

assert_equal(math.pow(base, exponent), expected)classTestMathUnitTest(unittest.TestCase):

@parameterized.expand([

("negative", -1.5, -2.0),

("integer", 1, 1.0),

("large fraction", 1.6, 1),

])deftest_floor(self, name, input, expected):

assert_equal(math.floor(input), expected)

在 nose (andnose2)下运行:

$ 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----------------------------------------------------------------------Ran7 tests in0.002s

OK

As the package name suggests, noseis best supported and will be used forall further examples.

With py.test (version2.0 andabove):

$ py.test-v test_math.py============================== test session starts ==============================platform darwin-- Python 2.7.2 -- py-1.4.30 -- pytest-2.7.1collected7items

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 (andunittest2):

$ 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----------------------------------------------------------------------Ran3 tests in0.000s

OK

(note: because unittest doesnot support test decorators, only tests created with @parameterized.expand will be executed)

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

from parameterized importparameterized, param#A list of tuples

@parameterized([

(2, 3, 5),

(3, 5, 8),

])deftest_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")

)deftest_from_json_file(...):

...#A callable which returns a list of tuples

defload_test_cases():return[

("test1", ),

("test2", ),

]

@parameterized(load_test_cases)deftest_from_function(name):

...

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

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

from parameterized importparameterizedclassAddTest(object):

@parameterized([

(2, 3, 5),

])deftest_add(self, a, b, expected):

assert_equal(a+b, expected)

@parameterized([

(2, 3, 5),

])deftest_add(a, b, expected):

assert_equal(a+ b, expected)

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

importunittestfrom parameterized importparameterizedclassAddTestCase(unittest.TestCase):

@parameterized.expand([

("2 and 3", 2, 3, 5),

("3 and 5", 2, 3, 5),

])deftest_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----------------------------------------------------------------------Ran2 tests in0.001s

OK

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

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

importunittestfrom parameterized importparameterizeddefcustom_name_func(testcase_func, param_num, param):return "%s_%s" %(

testcase_func.__name__,

parameterized.to_safe_name("_".join(str(x) for x inparam.args)),

)classAddTestCase(unittest.TestCase):

@parameterized.expand([

(2, 3, 5),

(2, 3, 5),

], testcase_func_name=custom_name_func)deftest_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----------------------------------------------------------------------Ran2 tests in0.001s

OK

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

from parameterized importparameterized, 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 importparameterized

@parameterized([

(1, 2, 3),

(4, 5, 9),

])deftest_add(a, b, expected):"""Test addition."""assert_equal(a+b, expected)defmy_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)deftest_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)) ... ok1: test_subtraction with param(*(9, 6, 3)) ... ok----------------------------------------------------------------------Ran4 tests in0.001s

OK

仔细学习可以查看在github上有详尽的使用方法

from

 wolever & thanks!!!

你可能感兴趣的:(python,unittest参数化)