2015-02-24 2 views
4

Я пытаюсь запустить те же тестовые примеры с различными методами setUp. Я пробовал использовать nosetests и параметризован, но похоже, что он не поддерживает параметризацию методов setUp. Вот пример того, что я пытаюсь сделать:Как параметризовать метод setUp python unittest?

... 
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() takes exactly 2 arguments (1 given).

Есть ли другой способ, как параметризовать метод setUp? Я также изучал генераторы носететов, но, похоже, это не так.

ответ

0

Используйте атрибут класса:

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.

+0

Вы имеете в виду, что я должен передать устройство в тест через аргумент командной строки? – finspin

+0

Вы могли бы, я не уверен, как вы устанавливаете тесты. Я хочу сказать, что устройство никогда не менялось во время тестов, поэтому нет смысла назначать его снова и снова. Один раз во время настройки класса хорошо, и класс должен тестировать разные устройства с разными прогонами (при условии, что все устройства должны пройти все тесты). –

+0

Вызов тестового файла несколько раз, всегда с разными значениями параметров - это то, чего я пытаюсь избежать из-за целей отчетности. Мне нужно иметь только один отчет, содержащий все устройства, чтобы я мог включить его в рабочий процесс непрерывной интеграции. Выполнение этих тестов с помощью nosetests и параметризацией приведет к такому результату, только если он хорошо сыграет с параметризацией метода setUp. – finspin

1

Таким образом, мой подход будет заключаться в базовом тесте, который содержит все тесты, которые должны пройти устройства. Затем вы должны использовать DeviceTests, которые наследуют от этого 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) 
+0

Это может работать с небольшим списком устройств, но у меня могут быть сотни устройств. Также список устройств является динамическим (то есть он выбирается через API перед каждым тестовым прогоном, и каждый раз он может содержать разные блоки) – finspin

-1

Я просто хотел бы использовать плагин paramaterized вокруг теста, и взывать пользовательские настройки и Teardown методы, передавая параметры устройства к ним, как часть испытания. Существует очень мало магии вокруг использования unittest setUp(), и похоже, что вы все равно злоупотребляете им.

Смежные вопросы