【问题标题】:Python unittest import module with nostest带有 nostest 的 Python unittest 导入模块
【发布时间】:2017-10-12 22:10:55
【问题描述】:

我想把我所有的单元测试放在一个单独的目录中。我的项目布局如下所示:

project
    package
        __init__.py
        package.py
    tests
        __init__.py
        package_test.py

package_test.py 看起来像:

from unittest import TestCase
from package import Service

class ServiceTest(TestCase):

    def test_build():
        service = Service.build()
        self.assertIsNotNone(service)

当我尝试运行测试时,出现以下错误

$ cd project
$ nosetest
E
======================================================================
ERROR: Failure: ImportError (cannot import name 'ScraperService')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/nose/failure.py", line 39, in runTest
    raise self.exc_val.with_traceback(self.tb)
  File "/usr/local/lib/python3.6/site-packages/nose/loader.py", line 418, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/local/lib/python3.6/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/local/lib/python3.6/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/usr/local/lib/python3.6/imp.py", line 234, in load_module
    return load_source(name, filename, file)
  File "/usr/local/lib/python3.6/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 675, in _load
  File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "/usr/src/project/tests/package_test.py", line 2, in <module>
    from package import Service
ImportError: cannot import name 'Service'

----------------------------------------------------------------------
Ran 1 test in 0.046s

FAILED (errors=1)

如何将我的包导入我的测试类?

我必须将项目设为模块吗?

我必须用setup.py 打包它以进行分发吗?

【问题讨论】:

  • 将导入更改为from package.package import Service 会有什么不同吗?
  • 哇!确实如此!但为什么呢?
  • 文件夹中的第一个 package,文件中的第二个。您必须提供导入模块的完整路径,包括所有子目录。
  • 我认为package 文件夹中的package.py 是一个单独的模块。

标签: python python-unittest nose python-module


【解决方案1】:

我遇到了类似的情况。就我而言,我有一个名为

的文件夹

练习/

各种练习题存在的地方

我有练习/t

练习问题的测试所在的位置 - 我将它们命名为与问题本身相同。

所以

 practice/calculus.py

经过测试

 practice/t/calculus.py

这是我为启用此结构所做的:

内部实践/t/calculus.py:

 import sys
 sys.path.append('../..')
 from practice.calculus import *

这区分了微积分,测试和微积分,问题。

不清楚,这是文件的正确布局 - 但它确实有助于理解 python 中的命名空间。与许多其他语言不同,命名空间是动态的,并且与模块的用户相关,而不是模块本身。

如果你有一个文件夹结构,

A/B/C/d.py

那么d可以导入为:

from A.B.C.d import *
from B.C.d import *
from C.d import *
from d import *

然后您通过 sys.path 指定您的根目录。

当然,sys.path可以在你的环境中指定,

 export PYTHONPATH=$PYTHONPATH:/absolute/path/to/AorBorCorD

因此这是一种上下文相关的方法。

【讨论】:

    【解决方案2】:

    为了解决您的问题,您应该将导入更改为完整路径,包括模块目录:

    from package.package import Service
    

    之所以如此,是因为python加载modules的方式:

    包是一种构建 Python 模块命名空间的方法,使用 “带点的模块名称”。例如,模块名称 A.B 指定一个 在名为 A 的包中名为 B 的子模块。导入包时, Python 搜索 sys.path 上的目录以查找 包子目录。

    所以,在您的项目中有package 文件夹,其中包含package.py 文件。所以为了让python可以找到它,你必须提供完整的路径。

    【讨论】:

      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多