无法在单元测试中导入 class
Unable to import a class in unittest
这可能是一个初学者问题,但我真的很紧张。
我有一个非常简单的 Python 脚本 "foo":
#!/usr/bin/env python
class Foo():
def __init__(self):
self.do_something()
def do_something(self):
print "foo"
def main():
Foo()
if __name__ == '__main__':
main()
脚本工作正常:
$ python foo.py
foo
我想在 unittest 中测试函数 "do_something",我有这段代码:
#!/usr/bin/env python
import unittest
import foo
from foo import *
class TestFoo(unittest.TestCase):
def test_foo(self):
Foo()
def main():
unittest.main()
if __name__ == "__main__":
main()
如果我 运行 测试,但是,我得到:
$ python pyunit/foo.py
E
======================================================================
ERROR: test_foo (__main__.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "pyunit/foo.py", line 9, in test_foo
Foo()
NameError: global name 'Foo' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
我的项目结构:
$ tree
.
├── foo.py
└── pyunit
└── foo.py
我一直在玩 inspect
、dir()
、Python 调试器等,但我一无所获。
虽然 import foo
和 from foo import *
都执行得很好,而且我看到从该文件导入的函数 main
,但 class 本身 Foo
没有好像是进口的。
我的objective,归根结底,就是再为classFoo
中的函数编写单元测试。
我做错了什么?
您不应在模块中使用相同的文件名 (foo.py)。将您的测试模块改为 test_foo。 显式优于隐式。
从父目录导入模块时,您需要使用 from <parent_dir> import <module_name>
,因此在您的情况下您应该声明 from <parent_dir> import foo
您遇到 ImportError: No module named foo
错误是因为您的模块不是 sys.path
的一部分。
将本地目录导入 python 的查找路径的最简单方法:
import sys
sys.path.append('.')
在其他导入语句之前。这会将项目目录附加到路径中。如果你有多个同名的类,你最好使用sys.path.insert(0, '.')
将路径推到第一个位置
Python 测试可能会令人不安,尤其是对于相关导入。
所以我找到了解决方法。
首先也是最重要的:我建议你安装 pytest 来解析包含测试模块的 sys.path 中的名称。通过 [=31= 安装它] pip install pytest
.
对于相对导入,您正在尝试访问测试包外部的模块,要解决此问题,请使用导入的 点 表示,即
from ..foo import Foo
确保您已删除 import foo
然后尝试 运行 测试 pytest
或 pytest test_foo.py
(如果你在 pyunit 文件夹中)
这可能是一个初学者问题,但我真的很紧张。
我有一个非常简单的 Python 脚本 "foo":
#!/usr/bin/env python
class Foo():
def __init__(self):
self.do_something()
def do_something(self):
print "foo"
def main():
Foo()
if __name__ == '__main__':
main()
脚本工作正常:
$ python foo.py
foo
我想在 unittest 中测试函数 "do_something",我有这段代码:
#!/usr/bin/env python
import unittest
import foo
from foo import *
class TestFoo(unittest.TestCase):
def test_foo(self):
Foo()
def main():
unittest.main()
if __name__ == "__main__":
main()
如果我 运行 测试,但是,我得到:
$ python pyunit/foo.py
E
======================================================================
ERROR: test_foo (__main__.TestFoo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "pyunit/foo.py", line 9, in test_foo
Foo()
NameError: global name 'Foo' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
我的项目结构:
$ tree
.
├── foo.py
└── pyunit
└── foo.py
我一直在玩 inspect
、dir()
、Python 调试器等,但我一无所获。
虽然 import foo
和 from foo import *
都执行得很好,而且我看到从该文件导入的函数 main
,但 class 本身 Foo
没有好像是进口的。
我的objective,归根结底,就是再为classFoo
中的函数编写单元测试。
我做错了什么?
您不应在模块中使用相同的文件名 (foo.py)。将您的测试模块改为 test_foo。 显式优于隐式。
从父目录导入模块时,您需要使用 from <parent_dir> import <module_name>
,因此在您的情况下您应该声明 from <parent_dir> import foo
您遇到 ImportError: No module named foo
错误是因为您的模块不是 sys.path
的一部分。
将本地目录导入 python 的查找路径的最简单方法:
import sys
sys.path.append('.')
在其他导入语句之前。这会将项目目录附加到路径中。如果你有多个同名的类,你最好使用sys.path.insert(0, '.')
将路径推到第一个位置
Python 测试可能会令人不安,尤其是对于相关导入。 所以我找到了解决方法。
首先也是最重要的:我建议你安装 pytest 来解析包含测试模块的 sys.path 中的名称。通过 [=31= 安装它] pip install pytest
.
对于相对导入,您正在尝试访问测试包外部的模块,要解决此问题,请使用导入的 点 表示,即
from ..foo import Foo
确保您已删除 import foo
然后尝试 运行 测试 pytest
或 pytest test_foo.py
(如果你在 pyunit 文件夹中)