3

我有一个python unitest。在setupClass方法中,我花了一些时间来完成任务...测试本身运行速度非常快。现在我想用多组参数运行相同的Testcase。我怎样才能做到这一点?Python测试如何运行参数化测试用例并将参数传递给setupClass

我试过differet与nose_parameterized等方法,但有我不能使用@ parameterized.expand()

import unittest 
from nose_parameterized import parameterized 


parameters = [('test1', 2),('test2', 3)] 


class TestParameterizedTestcase(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls, param=1): 
     """ 
     Do some expensive stuff 
     """ 
     cls.param = param 
     print 'Param in setup class %s' 


    def test_is_one(self): 
     """ 
     A fast test 
     """ 
     self.assertEqual(1,self.param) 

    def test_is_two(self): 
     """ 
     Another fast test 
     """ 
     self.assertEqual(2, self.param) 

    def test_is_three(self): 
     """ 
     Another fast test 
     """ 
     self.assertEqual(3, self.param) 
+0

您可以使用unittest.subTest情况管理器 - 看到这个线程http://stackoverflow.com/questions/43912153/executing-single-unittest-over-a - python中的序列 – volcano

回答

3

不幸的是,没有任何方法来创建参数测试类或者unittestnose,或parameterized

py.test有你展示如何建立自己的参数测试类,这里一个例子:https://pytest.org/latest/example/parametrize.html#a-quick-port-of-testscenarios

而且你可以建立自己的参数化类发电机是这样的:

class MyTestClassBase(object): 
    # Inherit from `object` so unittest doesn't think these are tests which 
    # should be run 

    @classmethod 
    def setUpClass(cls): 
     print "doing expensive setup with", cls.param 

    def test_one(self): 
     self.assertEqual(self.param, 1) 


params = [('test1', 1), ('test2', 2)] 

for name, param in params: 
    cls_name = "TestMyTestClass_%s" %(name,) 
    globals()[cls_name] = type(cls_name, (MyTestClassBase, unittest.TestCase), { 
     "param": param, 
    }) 

这将产生一个新的每个参数的测试类。

+1

只是为了完整性鼻子参数化是depricated。替换是https://pypi.python.org/pypi/parameterized – renzop

1

下面是一个单元测试的完整性的方法,但我prefere Davids的答案。

进口单元测试 从nose_parameterized进口参数

class TestParameterizedTestcase(unittest.TestCase): 
    param =3 
    @classmethod 
    def setUpClass(cls): 
     """ 
     Do some expensive stuff 
     """ 

     print 'Param in setup class %s' % cls.param 


    def test_is_one(self): 
     """ 
     Some fast test 
     """ 
     self.assertEqual(1,self.param) 

    def test_is_two(self): 
     """ 
     Anoter Fast test 
     """ 
     self.assertEqual(2, self.param) 

import unittest 
from unittest import TestLoader 

if __name__ == '__main__': 
    for param in range(5): 
     suite = unittest.TestSuite() 
     loader = TestLoader() 
     test = None 
     test = TestParameterizedTestcase 
     test.param =param 

     tests = loader.loadTestsFromTestCase(test) 
     suite.addTest(tests) 
     unittest.TextTestRunner().run(suite) 
相关问题