我有以下目录结构:
Project
├── README.md
├── app
│ ├── __init__.py
│ └── main.py
│
├── tests
│ ├── __init__.py
│ └── test_one.py
我想在test_one中导入app.main。我经历了类似的堆栈溢出问题,并尝试将路径添加到test_one.py文件中的应用程序文件夹,如下所示:
sys.path.append('/path to project/app')
但是,我收到以下错误:
模块未找到错误:没有名为"app"的模块
如何将文件从应用程序导入到test_one.py文件中?有没有一个简单的from ... import
语句来实现这一点?
您没有提到您正在使用的单元测试框架,但是如果您使用的是pytest,它已经支持测试在应用程序代码之外的那种应用程序/测试组织。
setup.py mypkg/ __init__.py app.py view.py tests/ test_app.py test_view.py ...
- ..
- 如果您没有
setup.py
文件并且依赖于以下事实 默认情况下,Python 将当前目录放在要导入sys.path
您的包,您可以执行python -m pytest
来执行测试 直接针对本地副本,无需使用pip
.
您的代码结构已正确。您无需手动设置sys.path
。您可以正常使用from app import main
(请参阅下面的示例test_one.py)。我唯一要添加的是pytest.ini用于指定测试文件的测试路径和模式。
目录结构:
Project
├── pytest.ini
├── app
│ ├── __init__.py
│ └── main.py
│
├── tests
│ ├── __init__.py
│ └── test_one.py
pytest.ini:
[pytest]
addopts = -v
console_output_style = count
python_files = test_*.py
testpaths = tests
样本main.py:
def calculate(x, y):
return x + y
样本test_one.py:
from app import main
def test_calculate():
assert(3 == main.calculate(1, 2))
运行 pytest:
$ pytest tests
=============================================================================== test session starts ===============================================================================
platform linux -- Python 3.7.2, pytest-4.6.2, py-1.8.0, pluggy-0.12.0 -- /home/gino/.virtualenvs/test-py37/bin/python3.7
cachedir: .pytest_cache
rootdir: /home/gino/Project, inifile: pytest.ini, testpaths: tests
collected 1 item
tests/test_one.py::test_calculate PASSED [1/1]
============================================================================ 1 passed in 0.01 seconds =============================================================================