【问题标题】:Python: Unable to import global variable initialized in setUp method from init filePython:无法从 init 文件导入在 setUp 方法中初始化的全局变量
【发布时间】:2015-06-19 15:53:47
【问题描述】:

我有一个包含测试模块的包,并且在 init 文件中我有一个带有一些操作的 setUp 方法。在包的模块中的任何单元测试运行之前,这些操作都会正确执行。在 setUp 方法中,我想初始化一个全局变量,然后从包的其他模块访问它。但这不起作用。

# TestPackage/__init__.py
def setUp():
    global spec_project
    core_manager = get_core_manager()
    spec_project = core_manager.get_spec()

#TestPackage/test_module.py
from TestPackage import spec_project
import unittest

class TestRules(unittest.TestCase):
    def setUp(self):
        spec_project.get_new_device()

这样我得到一个

ImportError: 无法导入名称 spec_project

如果我在 init 文件中的 setUp 方法之外初始化 spec_project 变量,我可以访问它,但它的内容在 setUp 方法中的操作之后不会更改。

# TestPackage/__init__.py
spec_project = None
def setUp():
    global spec_project
    core_manager = get_core_manager()
    spec_project = core_manager.get_spec()

#TestPackage/test_module.py
from TestPackage import spec_project
import unittest

class TestRules(unittest.TestCase):
    def setUp(self):
        spec_project.get_new_device()

像这样我得到一个

AttributeError: 'NoneType' 对象没有属性 'get_new_device'

如何在 init 文件的 setUp 方法中初始化 spec_project 变量,并且仍然可以从包中的其他模块访问它?

【问题讨论】:

  • “这些操作在包的模块中的任何单元测试运行之前正确执行。” - 你确定,因为它们似乎没有运行。
  • @jonrsharpe 我很确定,我可以在包的 setUp 方法中打印内容以确保它按预期运行。
  • __init__.setUp 是否应该在导入TestPackage 时运行?我无法复制这种行为。
  • @chepner 我用鼻子运行测试,它允许包级别的 setUp 和 tearDown 方法。毫无疑问,setUp 方法正在运行,在包中的任何其他测试用例之前,我可以轻松确认。

标签: python scope global-variables python-unittest


【解决方案1】:

看起来 setUp() 没有被调用,但如果你确定它是,那么它可能是你导入 TestPackage 的方式。尝试像这样导入:

#TestPackage/test_module.py
import TestPackage
import unittest

class TestRules(unittest.TestCase):
    def setUp(self):
        TestPackage.spec_project.get_new_device()

在使用全局之前必须调用 setUp() 方法。同样的事情应该适用于您尝试的第二种方式。但同样,这是假设 setUp 已运行。如果你觉得有必要,你可以给 TestPackage 取别名,或者如果它是在方法之外定义的,你应该可以导入它。

由于您明确导入它,它可能会尝试复制它,这是不可能的,因为它位于 setUp() 主体内。

【讨论】:

    猜你喜欢
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多