无法在unittest中导入类

时间:2017-09-10 12:03:22

标签: python python-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

我一直在玩inspectdir(),Python调试器等,但我无处可去。

虽然import foofrom foo import *都执行正常,但我看到从该文件导入的函数main,但似乎没有导入类本身Foo

我的目标最终是为类Foo中的函数编写单元测试。

我做错了什么?

2 个答案:

答案 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 foopytest(如果您在pyunit文件夹中)