Python 使用 nostest 的 unittest 导入模块
Python unittest import module with nostest
我想将我所有的单元测试放在一个单独的目录中。我的项目布局如下所示:
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)
如何将我的包导入到我的测试中 class?
我必须将项目设为模块吗?
我是否必须将其打包以便使用 setup.py
分发?
要解决您的问题,您应该将导入更改为完整路径,包括模块目录:
from package.package import Service
之所以可行,是因为 python 加载 modules 的方式:
Packages are a way of structuring Python’s module namespace by using
“dotted module names”. For example, the module name A.B designates a
submodule named B in a package named A. When importing the package,
Python searches through the directories on sys.path looking for the
package subdirectory.
因此,在您的项目中有 package
文件夹,其中包含 package.py
文件。所以为了 python 可以找到它,你必须提供完整路径。
我运行陷入了类似的境地。就我而言,我有一个名为
的文件夹
练习/
各种练习题所在的地方
我有practice/t
练习题的测试所在 - 我将它们命名为与问题本身相同的名称。
所以
practice/calculus.py
由
测试
practice/t/calculus.py
这就是我为启用此结构所做的工作:
里面 practice/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
因此这是一种上下文相关的方法。
我想将我所有的单元测试放在一个单独的目录中。我的项目布局如下所示:
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)
如何将我的包导入到我的测试中 class?
我必须将项目设为模块吗?
我是否必须将其打包以便使用 setup.py
分发?
要解决您的问题,您应该将导入更改为完整路径,包括模块目录:
from package.package import Service
之所以可行,是因为 python 加载 modules 的方式:
Packages are a way of structuring Python’s module namespace by using “dotted module names”. For example, the module name A.B designates a submodule named B in a package named A. When importing the package, Python searches through the directories on sys.path looking for the package subdirectory.
因此,在您的项目中有 package
文件夹,其中包含 package.py
文件。所以为了 python 可以找到它,你必须提供完整路径。
我运行陷入了类似的境地。就我而言,我有一个名为
的文件夹练习/
各种练习题所在的地方
我有practice/t
练习题的测试所在 - 我将它们命名为与问题本身相同的名称。
所以
practice/calculus.py
由
测试 practice/t/calculus.py
这就是我为启用此结构所做的工作:
里面 practice/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
因此这是一种上下文相关的方法。