将源文件导入测试文件

时间:2019-05-30 19:28:05

标签: unit-testing python-import python-3.7

我具有以下目录结构:

Project
├── README.md
├── app
│   ├── __init__.py
│   └── main.py
│   
├── tests
│   ├── __init__.py
│   └── test_one.py

我想在test_one中导入app.main。我经历了类似的stackoverflow问题,并尝试将路径添加到test_one.py文件中的app文件夹,如下所示:

sys.path.append('/path to project/app')

但是,出现以下错误:

ModuleNotFoundError:没有名为“ app”的模块

如何将文件从应用程序导入到test_one.py文件中?从... import语句有没有简单的方法可以实现这一点?

1 个答案:

答案 0 :(得分:0)

您没有提到正在使用什么单元测试框架,但是如果您使用的是pytest,那么它已经支持the tests are outside the application code中的那种应用程序/测试组织。

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 =============================================================================