conftest.py ImportError: No module named Foo
我有以下目录结构
1 2 3 4 5 6 7 8 9 10 | /home/ubuntu/test/ - Foo/ - Foo.py - __init__.py - Test/ - conftest.py - __init__.py - Foo/ - test_Foo.py - __init__.py |
foo.py包含
1 2 3 | class Foo(object): def __init__(self): pass |
号
conftest.py包含:
1 2 3 4 5 6 7 8 9 10 | import pytest import sys print sys.path from Foo.Foo import Foo @pytest.fixture(scope="session") def foo(): return Foo() |
测试结果包含:
1 2 3 | class TestFoo(): def test___init__(self,foo): assert True |
。
如果我运行pytest。在测试文件夹中,我得到一个错误,它找不到模块foo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Traceback (most recent call last): File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/_pytest/config.py", line 379, in _importconftest mod = conftestpath.pyimport() File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/py/_path/local.py", line 662, in pyimport __import__(modname) File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/_pytest/assertion/rewrite.py", line 212, in load_module py.builtin.exec_(co, mod.__dict__) File"/home/ubuntu/pythonVirtualEnv/local/lib/python2.7/site-packages/py/_builtin.py", line 221, in exec_ exec2(obj, globals, locals) File"<string>", line 7, in exec2 File"/home/ubuntu/test/Test/conftest.py", line 6, in <module> from Foo.Foo import Foo ImportError: No module named Foo ERROR: could not load /home/ubuntu/test/Test/conftest.py |
在conftest.py中打印出来的sys.path似乎包含了/home/ubuntu/test路径,因此它应该能够找到foo.py,对吗?
问题是它只在我将conftest.py移动到下面的文件夹时才起作用。
我运行pytest 3.2.2
该错误表示由于
1 2 3 4 5 6 7 8 9 | import pytest import sys print sys.path @pytest.fixture(scope="session") def foo(): from Foo.Foo import Foo return Foo() |
我建议您设置一个虚拟环境,并在虚拟环境中安装foo模块。
1 2 3 | pip install virtualenv virtualenv venv . ./venv/bin/activate |
号
要安装本地模块,需要一个
1 2 3 4 5 6 7 8 9 | from setuptools import setup setup( name='foo', version='0.0.1', author='My Name', author_email='[email protected]', packages=['Foo'], ) |
然后您可以在虚拟环境中安装foo模块:
为了更完整、更长期地做到这一点,请考虑使用需求文件。我通常把我需要的模块放在两个名为EDOCX1(用于生产)和EDOCX1(用于运行测试)的文件中。所以在
1 2 | json flask==1.0.2 |
。
其中指定了
1 2 3 | -r requirements.txt pytest -e . |
第一行意味着当安装
要安装
1 | pip install -r requirements-test.txt |
。
现在您可以运行测试,它将找到您的foo模块。这也是解决CI问题的一个好方法。