2015-04-17 4 views
0

Я запускаю тесты с носом и хотел бы использовать переменную из одного из элементов теста в другом. Для этого я создаю переменную при установке класса вверх. Мне кажется, что переменная копируется для каждого элемента, поэтому тот, что в классе остается фактически нетронутым. Если вместо простой переменной я использую список, я вижу поведение, которое я ожидал.Python & nose: какова переменная scope в «классе теста»?

я написал небольшую Exemple, мы можем наблюдать, что var1 и varg всегда показывают одинаковое значение при вводе теста:

import time 
import sys 
import logging 

logger = logging.getLogger('008') 


class Test008: 
    varg = None 

    @classmethod 
    def setup_class(cls): 
     logger.info('* setup class') 
     cls.var1 = None 
     cls.list1 = [] 

    def setup(self): 
     logger.info('\r\n* setup') 
     logger.info('\t var1: {}, varg: {}, list: {}'.format(
      self.var1, self.varg, self.list1)) 

    def teardown(self): 
     logger.info('* teardown') 
     logger.info('\t var1: {}, varg: {}, list: {}'.format(
      self.var1, self.varg, self.list1)) 

    def test_000(self): 
     self.var1 = 0 
     self.varg = 0 
     self.list1.append(0) 
     pass 

    def test_001(self): 
     # Here I would like to access the variables but they still show 'None' 
     self.var1 = 1 
     self.varg = 1 
     self.list1.append(1) 
     pass 

    @classmethod 
    def teardown_class(self): 
     logger.info('* teardown class') 

Результат:

nose.config: INFO: Ignoring files matching ['^\\.', '^_', '^setup\\.py$'] 
* setup class 
008_TestVars.Test008.test_000 ... 
* setup 
    var1: None, varg: None, list: [] 
* teardown 
    var1: 0, varg: 0, list: [0] 
ok 

008_TestVars.Test008.test_001 ... 
* setup 
    var1: None, varg: None, list: [0] 
* teardown 
    var1: 1, varg: 1, list: [0, 1] 
ok 
* teardown class 

---------------------------------------------------------------------- 

Есть ли способ, чтобы иметь значения var1 и varg могут быть перенесены из одного теста в другое?

+0

Прежде чем ответить на этот вопрос, скажи мне, почему вы хотите это сделать - если вы делаете тесты основаны на данных предыдущих испытаний они не являются модульными тестами (которые могут быть прекрасными), вам, вероятно, придется запускать их в известном порядке (который пропускает некоторые тесты обратной связи, которые могут вам дать. Почему вы чувствуете необходимость сделать это? – doctorlove

+1

Спасибо за быстрый ответ. команда с теми же параметрами, чтобы увидеть, что она была отвергнута второй раз. Поэтому я пишу тест второй раз с другим условием прохождения. Этот первый c ommand использует текущее время для заполнения одного из отправленных параметров. При отправке команды во втором тесте, я хочу получить тот же самый параметр. – Pierre

ответ

1

docs четко сказать

тестовый пример построен для выполнения каждого метода с новым экземпляром тестового класса

Если вам необходимо фактическое время, чтобы настроить параметр для функцию, которую вы тестируете, почему бы не написать тест, который настраивает состояние, вызывать свою функцию один раз и утверждать, что она проходит, затем вызывать ее снова и утверждать, если это не удается?

def test_that_two_calls_to_my_method_with_same_params_fails(self): 
    var1 = 1 
    varg = 1 
    assert myMethod(var1, varg) 
    assert myMethod(var1, varg) == False 

Я думаю, что это яснее, потому что один тест имеет все состояние вместе и может выполнять тесты в любом порядке.

Вы можете утверждать, что это так, потому что вы пытались использовать метод установки. В документах также указывается

Контрольный модуль - это модуль python, который соответствует регулярному выражению testMatch . Тестовые модули предлагают установку и отключение модуля; определите метод setup, setup_module, setUp или setUpModule для установки, teardown, teardown_module или tearDownModule для срыва.

Таким образом, за пределы класса есть

def setup_module() 
    #bother now I need to use global variables 
    pass 
+0

Спасибо! Я пошел на 'yield', а не утверждал, чтобы результаты были разделены. – Pierre