这可能是一个初学者的问题,但我真的把头发拉了出来。
我有一个非常简单的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
,但似乎没有导入类本身Foo
。
我的目标最终是为类Foo
中的函数编写单元测试。
我做错了什么?
答案 0 :(得分:2)
您不应在模块中使用相同的文件名(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, '.')
将路径推入第一个位置
答案 1 :(得分:1)
Python测试可能会令人不安,尤其是相对导入。 所以我得到了解决方法。
首先:我建议您安装 pytest ,它会解析包含测试模块的sys.path中的名称。运行kubectl delete pod test-1495806908-xn5jn
安装它。
对于相对导入,您试图访问测试包之外的模块,以解决此问题,使用导入的点表示,即
pip install pytest
确保您已移除from ..foo import Foo
然后尝试运行测试import foo
或pytest
(如果您在pyunit文件夹中)