我认为我想要做的事情相当简单。我想在测试设置函数中初始化几个变量,然后在用该设置修饰的测试函数中使用它们。以下简单的例子说明了我的意思:
from nose.tools import *
def setup():
foo = 10
def teardown():
foo = None
@with_setup(setup, teardown)
def test_foo_value():
assert_equal(foo, 10)
这导致:
$ 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)
使用旧的unittest样式,我可以将它们设置为测试类的实例变量,但我认为nosetests不要求你使用类。我也考虑将它们设置为包全局变量,但这似乎不是一个非常好的做法。我希望有一些显而易见的东西我不知道这样做。
提前感谢您的帮助。
答案 0 :(得分: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)
第三种变体可能是为您的值使用字典。这稍微不那么丑陋但是非常笨拙:
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)
答案 1 :(得分:2)
我使用了一个自定义的with_setup装饰器,它使用了非本地的穷人:https://gist.github.com/garyvdm/392ae20c673c7ee58d76
def setup():
foo = 10
return [foo], {}
def teardown(foo):
pass
@with_setup_args(setup, teardown)
def test_foo_value(foo):
nose.tools.assert_equal(foo, 10)
对于只有python3的项目,我使用nonlocal而不是.extend / .update用于args,kwargs。