2017-05-13 71 views
0

我想把我所有的单元测试放在一个单独的目录中。我的项目布局是这样的:Python单元测试导入模块与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) 

如何导入测试我的包装进我的测试课?

我必须让项目成为一个模块吗?

我是否必须打包才能发货?setup.py

+0

会改变导入到'从package.package导入服务'有什么区别? – grundic

+0

哇!它确实!但为什么? – Martinffx

+0

第一个来自文件夹的'package',第二个来自文件。您必须提供导入模块的完整路径,包括所有子目录。 – grundic

回答

1

解决你的问题,你应该改变进口是全路径,包括模块目录:

from package.package import Service 

的原因,因为这个工程是蟒蛇负载modules如何:

包是一种方法通过使用 “虚线模块名称”来构造Python的模块名称空间。例如,模块名称A.B在名为A的包中指定名为B的 子模块。在导入包时, Python搜索sys.path上的目录,查找 程序包子目录。

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