Python&鼻子:"测试类"中的变量范围是什么?

时间:2015-04-17 13:41:58

标签: python-2.7 nose nosetests

我正在使用nose运行测试,并希望使用另一个测试项中的变量。为此,我在设置类时创建变量。在我看来,变量是为每个项目复制的,因此该类中的变量实际上保持不变。如果我使用列表代替简单变量,我会看到我期待的行为。

我写了一个小例子,我们可以观察到var1varg在输入测试时总是显示相同的值:

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

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

有没有办法让var1varg的值从一个测试继续进行到另一个测试?

1 个答案:

答案 0 :(得分: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

我认为这更清楚,因为一个测试将所有状态组合在一起,并且可以按任何顺序运行测试。

你可以说它确实如此,因为你试图使用安装方法。文档也说

  

测试模块是一个匹配testMatch常规的python模块   表达。测试模块提供模块级设置和拆卸;限定   用于设置的方法设置,setup_module,setUp或setUpModule,   用于拆卸的拆卸,拆卸模块或者tearDownModule。

所以,在课外有一个

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