Python & nose: "test class" 中的变量作用域是什么?

Python & nose: what is the variable scope in the "test class"?

我正在 运行 测试 nose,并且想在另一个测试项目中使用一个变量。为此,我在设置 class 时创建了变量。在我看来,变量是为每个项目复制的,所以 class 中的那个实际上保持不变。如果我使用列表而不是简单变量,我会看到预期的行为。

我写了一个小例子,我们可以观察到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 的值从一个测试转移到另一个测试?

docs 说清楚

a test case is constructed to run each method with a fresh instance of the test class

如果您需要实际时间来为您正在测试的函数设置参数,为什么不编写一个设置状态的测试,调用您的函数一次并断言它通过,然后再次调用它并在失败时断言?

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

我认为这更清楚,因为一个测试包含所有状态,并且可以 运行 以任何顺序进行测试。

您可能会争辩说它确实如此,因为您正在尝试使用设置方法。文档还说

A test module is a python module that matches the testMatch regular expression. Test modules offer module-level setup and teardown; define the method setup, setup_module, setUp or setUpModule for setup, teardown, teardown_module, or tearDownModule for teardown.

所以,在你的 class 之外有一个

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