Python & nose: "test class" 中的变量作用域是什么?
Python & nose: what is the variable scope in the "test class"?
我正在 运行 测试 nose,并且想在另一个测试项目中使用一个变量。为此,我在设置 class 时创建了变量。在我看来,变量是为每个项目复制的,所以 class 中的那个实际上保持不变。如果我使用列表而不是简单变量,我会看到预期的行为。
我写了一个小例子,我们可以观察到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
的值从一个测试转移到另一个测试?
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
我正在 运行 测试 nose,并且想在另一个测试项目中使用一个变量。为此,我在设置 class 时创建了变量。在我看来,变量是为每个项目复制的,所以 class 中的那个实际上保持不变。如果我使用列表而不是简单变量,我会看到预期的行为。
我写了一个小例子,我们可以观察到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
的值从一个测试转移到另一个测试?
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