Python 鼻子中的设置模块和设置函数

Python 鼻子中的设置模块和设置函数,python,unit-testing,nose,Python,Unit Testing,Nose,我正在尝试在nose中编写测试,但我需要一些关于模块和函数设置逻辑的帮助 def setup_func(): q_object = u'item' retry_in = 20 @with_setup(setup_func) def test_set(): assert q_object == u'item' 当我运行测试时,我得到以下错误: NameError: global name 'q_object' is not defined 那么如何在测试函数中访问q_

我正在尝试在nose中编写测试,但我需要一些关于模块和函数设置逻辑的帮助

def setup_func():
    q_object = u'item'
    retry_in = 20

@with_setup(setup_func)
def test_set():
    assert q_object == u'item'
当我运行测试时,我得到以下错误:

NameError: global name 'q_object' is not defined
那么如何在测试函数中访问q_对象呢? 以及如何从特定测试类中的setup_module()访问对象

我找到了安装模块

setup_module(module):
    module.item = u'item'

而在模块中,我只是简单地使用创建的对象项。

实际上,您正试图在测试中访问全局变量。因此,您的代码应该看起来像这样

q_object = None

def setup_func():
    global q_object
    q_object = u'item'

@with_setup(setup_func)
def test_set():
    global q_object
    assert q_object == u'item'
但是使用全局变量——真的不是一个好主意。试着找到另一种可以让你避开它们的方法

我认为考试课会非常适合你

class ExampleTest(unittest.TestCase):
    def setUp(self):
        self.q_object = u'item'

    def test_a(self):
        assert self.q_object == u'item'

它仍然不是完美的(相同的全局vars解决方案),但至少包装在类中。

这段代码在nose中对我有用:

它融合了两个世界的优点。类来保存范围和比默认unittest2框架更干净的测试

class TestSomething(object):

  def setup(self):
    self.q_object = u'item'

  def test_set(self):
    eq_(self.q_object, u'item')

我从那里学习。在没有全局变量的情况下,无法写入setup_func?例如,我在示例中提供的setup_module函数,nose允许我在module、function、class、method的任何部分使用对象“item”。我更新了我的帖子,展示了将测试包装到类中的示例。它比globals更好,因为至少它将vars从全局上下文中隔离出来。谢谢你们的帮助,但我理解将测试包装到案例中的逻辑。我写了一篇关于nose测试的论文,我想给出使用setup_func函数的例子。我只是想知道我是否可以在这里绕过global的使用。例如,当我使用setup_模块设置对象项时,我可以访问它,而无需在模块中的测试的任何部分中引用为全局。鼻子知道我指的是什么东西。这是一个与鼻子相关的具体问题。我不确定,但将变量添加到模块-与将其添加到全局变量相同。无论如何-setup_func不用于设置变量。这就是为什么我建议如何避免它。