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) 
相關問題