Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何参数化python unittest设置方法?_Python_Nosetests_Unit Testing - Fatal编程技术网

如何参数化python unittest设置方法?

如何参数化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

我试图用不同的设置方法运行相同的测试用例。我尝试过使用nosetest和参数化方法,但它似乎不支持参数化设置方法。下面是我尝试做的一个例子:

...
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运行这些测试将产生这样的结果,前提是它与参数化设置方法配合得很好。