使用 pytest 的 Python 项目的正确文件夹结构是什么?

Ed1*_*123 17 python directory-structure working-directory pytest python-3.x

我尝试使用文件夹结构来组织我的 Python 项目。当我需要进行测试时,我使用类似以下的东西。

.
|-- src
|   |-- b.py
|   `-- main.py
`-- tests
    `-- test_main.py
Run Code Online (Sandbox Code Playgroud)

这种方法有一个大问题。main.py如果正在导入,Pytest 将不会运行b.py

到目前为止,我已经尝试将空__init__.py文件单独或一起放置在src和文件夹中,但其中任何一个似乎都有效。tests

在我看来,这是一个非常标准的项目,但我无法在网上找到解决方案。我应该使用不同的文件夹结构吗?有没有推荐的方法在此类项目中使用 pytest?


这是文件的内容:

# b.py
def triplicate(x):
        return x * 3
Run Code Online (Sandbox Code Playgroud)
# main.py
from b import triplicate

def duplicate(x):
        return x * 2
Run Code Online (Sandbox Code Playgroud)
# test_main.py
from src.main import duplicate


def test_duplicate():
        assert duplicate(2) == 4
Run Code Online (Sandbox Code Playgroud)

这是我运行 pytest 时遇到的错误:

==================================================================================================== ERRORS ====================================================================================================
_____________________________________________________________________________________ ERROR collecting tests/test_main.py ______________________________________________________________________________________
ImportError while importing test module 'C:\Users\edwar\test_pytest\tests\test_main.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
c:\python39\lib\importlib\__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests\test_main.py:1: in <module>
    from src.main import duplicate
src\main.py:1: in <module>
    from b import triplicate
E   ModuleNotFoundError: No module named 'b'
=========================================================================================== short test summary info ============================================================================================
ERROR tests/test_main.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=============================================================================================== 1 error in 0.15s ===============================================================================================

Run Code Online (Sandbox Code Playgroud)

Nat*_*ord 4

Python 使用“环境变量”PYTHONPATH来查找从中导入代码的源。默认情况下,你执行 python 程序的目录会自动包含在内,但是你想在测试时包含这样的内容:

PYTHONPATH=$PYTHONPATH,../src python test_main.py
Run Code Online (Sandbox Code Playgroud)

这是如果您从源目录执行测试的话。IntelliJ (PyCharm) 等工具可让您将其添加为测试调用中的值。或者您可以使用export PYTHONPATH=.... (请注意,这是针对 *nix 环境的,您在 Windows 上的情况可能会有所不同。)

结果是,其中的每个目录都PYTHONPATH将被加载,并且 Python 将尝试将其用作您尝试导入的模块的“根”。您的基本目录结构是最惯用的。

  • 有关正确配置的更多信息,请参阅此答案PYTHONPATH
  • 有关如何在“幕后”修改和使用的更多信息,请参阅此文档。PYTHONPATH
  • 有关运行测试时包含目录的选项,请参阅此答案srcpytest
  • 请参阅此博客文章,了解如何使用autoenv(Python 库)来启用.env文件的使用来为您管理此内容(至少在设置内virtualenv- 通常是个好主意)。
  • setup.py也是包含许多模块的惯用方法,并且可以为您正在处理的情况提供更方便的路径。

  • 为每个项目调整“PYTHONPATH”似乎不是一个好的解决方案。 (4认同)