如何访问python nosetests设置函数中设置的变量

Mar*_*zzi 21 python nose

我想我想做的事情很简单.我想在测试设置函数中初始化几个变量,然后在用该设置修饰的测试函数中使用它们.以下简单的例子说明了我的意思:

from nose.tools import *

def setup():
    foo = 10

def teardown():
    foo = None

@with_setup(setup, teardown)
def test_foo_value():
    assert_equal(foo, 10)
Run Code Online (Sandbox Code Playgroud)

这导致:

$ nosetests tests/test_foo.py 
E
======================================================================
ERROR: test_foo.test_foo_value
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/mtozzi/.virtualenvs/foo/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
  File "/home/mtozzi/code/foo/tests/test_foo.py", line 12, in test_foo_value
assert_equal(foo, 10)
NameError: global name 'foo' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.006s

FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)

使用旧的unittest样式,我可以将它们设置为测试类的实例变量,但我认为nosetests不要求你使用类.我也考虑将它们设置为包全局变量,但这似乎不是一个非常好的做法.我希望有一些显而易见的事情我不知道这样做.

在此先感谢您的帮助.

ros*_*ori 13

正如您已经建议的问题的评论,只需切换到类并使用实例变量,如self.foo.这就是它应该做的方式.

如果你坚持不使用类,请尝试global变量.但是你没有听到这个消息.

from nose.tools import *

foo = None

def setup():
    global foo  # Ugly.
    foo = 10

def teardown():
    global foo  # Ugly.
    foo = None

@with_setup(setup, teardown)
def test_foo_value():
    assert_equal(foo, 10)
Run Code Online (Sandbox Code Playgroud)

第三种变体可能是为您的值使用字典.这稍微不那么丑陋但是非常笨拙:

from nose.tools import *

_globals = {'foo': None}

def setup():
    _globals['foo'] = 10

def teardown():
    _globals['foo'] = None

@with_setup(setup, teardown)
def test_foo_value():
    foo = _globals['foo']
    assert_equal(foo, 10)
Run Code Online (Sandbox Code Playgroud)