如何参数化python unittest设置方法?
我试图用不同的设置方法运行相同的测试用例。我尝试过使用nosetest和参数化方法,但它似乎不支持参数化设置方法。下面是我尝试做的一个例子:如何参数化python unittest设置方法?,python,nosetests,unit-testing,Python,Nosetests,Unit Testing,我试图用不同的设置方法运行相同的测试用例。我尝试过使用nosetest和参数化方法,但它似乎不支持参数化设置方法。下面是我尝试做的一个例子: ... from nose_parameterized import parameterized class Example(unittest.TestCase): @parameterized.expand(['device1', 'device2']) def setUp(self, device): desired
...
from nose_parameterized import parameterized
class Example(unittest.TestCase):
@parameterized.expand(['device1', 'device2'])
def setUp(self, device):
desired_caps = {}
desired_caps['key1'] = device
desired_caps['key2'] = 'constant value'
self.driver = webdriver.Remote(url, desired_caps)
def tearDown(self):
self.driver.quit()
def test_app_launch(self):
# assert something
错误是:TypeError:setUp()只接受2个参数(给定1个)
是否有其他方法可以参数化设置方法?我还研究了nosetests生成器,但这似乎也不是解决问题的方法。使用class属性:
class Example(unittest.TestCase):
# change before running tests
device = None
# make sure device is initialized
def setUpClass(cls):
if not cls.device:
raise Exception("Please initialize device before running tests")
def setUp(self):
# consider moving to 'setUpClass'
desired_caps = {}
desired_caps['key1'] = Example.device
desired_caps['key2'] = 'constant value'
self.driver = webdriver.Remote(url, desired_caps)
def tearDown(self):
self.driver.quit()
def test_app_launch(self):
# assert something
并分别为每个设备运行测试。代码建议可以将更多内容移动到
setUpClass
方法。因此,我的方法是设置一个基本测试,其中包含设备必须通过的所有测试。然后,您必须使用从baseTest继承的设备测试,以及它们自己的附加设置,这些设置是特定于设备的
# this is the base test. Everything that is not specific to the device is set up here. It also contains all the testCases.
import unittest
class deviceTest( unittest.TestCase ):
def setUp( self ):
'''
General setUp here
'''
self.desired_caps = {}
self.desired_caps['key2'] = 'constant value'
def testWorkflow( self ):
'''
Here come the tests that the devices have to pass
'''
class device1Test( deviceTest ):
def setUp( self ):
'''
device1 specific setup
'''
#also run general setUp
deviceTest.setUp( self )
self.desired_caps['key1'] = device
self.driver = webdriver.Remote(url, desired_caps)
class device2Test( deviceTest ):
def setUp( self ):
'''
device2 specific setup
'''
#also run general setUp
deviceTest.setUp( self )
self.desired_caps['key1'] = device
self.driver = webdriver.Remote(url, desired_caps)
if __name__ == '__main__':
suite = unittest.defaultTestLoader.loadTestsFromTestCase( device1Test )
suite.addTest( unittest.defaultTestLoader.loadTestsFromTestCase(device2Test ) )
unittest.TextTestRunner( verbosity = 2 ).run( suite )
我会在测试中使用参数化插件,调用自定义设置和拆卸方法,将设备参数作为测试的一部分传递给它们。使用unittest的
setUp()
几乎没有什么神奇之处,而且看起来您似乎在滥用它。这可能适用于一小部分设备,但我可能有数百台设备。此外,设备列表是动态的(即,它在每次测试运行之前通过API获取,每次可能都包含不同的设备集),它对我有效,但我通过将设备名称传递给方法,减少了更多的特定设置。在deviceXTest:deviceTest.setup(self,device_name)中,然后从父设备测试中,您可以使用此参数创建适当的CAP并调用驱动程序。您的意思是我应该通过命令行参数将设备传递给测试?可以,我不确定如何设置测试。我的观点是,设备在整个测试过程中都不会改变,所以一次又一次地分配它是没有意义的。在类设置期间,只需一次就可以了,并且类应该使用不同的运行测试不同的设备(假设所有设备都必须通过所有测试)。出于报告目的,我试图避免多次调用测试文件(始终使用不同的参数值)。我只需要一个包含所有设备的报告,这样我就可以将其包含在持续集成工作流中。使用nosetests和parameterized运行这些测试将产生这样的结果,前提是它与参数化设置方法配合得很好。