2015-03-19 4 views
1

Я пытаюсь найти способ использовать нос для запуска нескольких тестовых примеров в классе, но мне нужно сделать это, когда нос только создает один экземпляр этого класс. Этот класс проверит сеть, и настройка сети займет несколько минут, поэтому необходимо выполнить все тесты через один экземпляр класса. Вот простой пример того, что я пытаюсь сделать:класс тестирования носа с генератором для нескольких тестов, но только один экземпляр класса

class TestUmbrella(object): 

    def __init__(self): 
     log.info('__init__ called') 

    def run_A(self): 
     log.info('Test A is running') 

    def run_B(self): 
     log.info('Test B is running') 

    def run_C(self): 
     log.info('Test C is running') 

    def run_test(self): 
     for x in (self.run_A, self.run_B, self.run_C): 
      yield x 

Это дает:

2015-03-19 12:22:31,330: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: Test A is running 
.2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test B is running 
.2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test C is running 
. 
---------------------------------------------------------------------- 
Ran 3 tests in 0.002s 

OK 

То, что я хотел бы видеть это:

2015-03-19 12:22:31,330: INFO:  tests.l3.FooTest2: __init__ called 
2015-03-19 12:22:31,331: INFO:  tests.l3.FooTest2: Test A is running 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test B is running 
2015-03-19 12:22:31,332: INFO:  tests.l3.FooTest2: Test C is running 

Любые идеи о том, как получить нос, чтобы сделать это?

ответ

2

Два способа получить то, что вы хотите: Используйте unittest.TestCase класс с setUpClass для вашего TestUmbrella:

from unittest import TestCase 
import logging as log 

class TestUmbrella(TestCase): 
    @classmethod 
    def setUpClass(cls): 
     log.info('__init__ called') 

    def run_A_test(self): 
     log.info('Test A is running') 

    def run_B_test(self): 
     log.info('Test B is running') 

    def run_C_test(self): 
     log.info('Test C is running') 

Заметим, что вы больше не будете иметь возможность урожая вещи на лету, и придется переименовать методы в соответствовать образцу теста носа. Это даст вам:

$ nosetests cls_test.py -v 
INFO:root:__init__ called 
run_A_test (cls_test.TestUmbrella) ... INFO:root:Test A is running 
ok 
run_B_test (cls_test.TestUmbrella) ... INFO:root:Test B is running 
ok 
run_C_test (cls_test.TestUmbrella) ... INFO:root:Test C is running 
ok 

---------------------------------------------------------------------- 
Ran 3 tests in 0.007s 

OK 

В качестве альтернативы, вы можете просто вводить метод установки в класс, но не как часть инициализации класса:

import logging as log 

class TestUmbrella(object): 
    def my_setup(self): 
     log.info('__init__ called') 

    def run_A(self): 
     log.info('Test A is running') 

    def run_B(self): 
     log.info('Test B is running') 

    def run_C(self): 
     log.info('Test C is running') 

    def run_test(self): 
     self.my_setup() 
     for x in (self.run_A, self.run_B, self.run_C): 
      yield x 

Наконец, если вы действительно не можете разгрузить тяжелую логику от конструктор, вы можете запускать свои тесты из автономной функции следующим образом:

def run_test(): 
    tu = TestUmbrella() 
    for x in (tu.run_A, tu.run_B, tu.run_C): 
     yield x 
+0

С обоими этими подходами нос все еще создает три экземпляра TestUmbrella. Я пытаюсь найти способ, чтобы нос запускал три тестовых примера, но из одного экземпляра TestUmbrella. – user1106281

+0

, чтобы показать, как получить один экземпляр класса TestUmbrella. – Oleksiy

+0

Теперь, почему я не подумал об этом? :) Спасибо, это именно то, что я искал. – user1106281