无法在单元测试中导入 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

我一直在玩 inspectdir()、Python 调试器等,但我一无所获。

虽然 import foofrom 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

然后尝试 运行 测试 pytestpytest test_foo.py(如果你在 pyunit 文件夹中)