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

ars1skjm  于 2022-12-24  发布在  Python
关注(0)|答案(3)|浏览(223)

我试着用文件夹结构来组织我的Python项目,当我需要做测试时,我会使用类似下面的方法。

.
|-- src
|   |-- b.py
|   `-- main.py
`-- tests
    `-- test_main.py

这种方法只有一个大问题,如果main.py正在导入b.py,Pytest将无法运行。
到目前为止,我已经尝试过将空的__init__.py文件放在srctests文件夹中,既可以单独放置,也可以放在一起,但似乎任何一个都能正常工作。
在我看来,这是一个相当标准的项目,但是我还没有能够在网上找到一个解决方案。我应该使用不同的文件夹结构吗?有没有推荐的方法来使用pytest处理这类项目?
以下是文件的内容:
x一个一个一个一个x一个一个二个一个x一个一个三个一个
这是我在运行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 ===============================================================================================
rxztt3cl

rxztt3cl1#

Python使用“环境变量”PYTHONPATH来寻找要导入代码的源代码,默认情况下,会自动包含执行Python程序的目录,但在测试时,您需要包含类似下面的内容:

PYTHONPATH=$PYTHONPATH,../src python test_main.py

这是在从源目录执行测试的情况下,IntelliJ(PyCharm)等工具可以让你在测试调用中将其作为一个值添加,或者你可以使用export PYTHONPATH=...(注意这是针对 *nix环境的,你在windows上的应用可能会有所不同)。
结果是PYTHONPATH中的每个目录都会被加载,Python会尝试将其作为您试图导入的模块的“根”目录,您的基本目录结构是最惯用的。

  • 有关正确配置PYTHONPATH的详细信息,请参见this answer
  • 有关如何修改和“幕后”使用PYTHONPATH的更多信息,请参见此文档。
  • 有关在运行pytest测试时包含src目录的选项,请参见this answer
  • 请参见this blog post关于使用autoenv(Python库)来启用.env文件的使用,以便为您管理这一点(至少在virtualenv设置中-通常是个好主意)。
  • setup.py也习惯于包含许多模块,并且可以为您正在处理的情况提供更方便的路径。
vc6uscn9

vc6uscn92#

编辑:发帖后,I realized that someone has already posted this solution in a different question,很多年前。
如果您只想从根目录运行所有测试,而不必担心PYTHONPATH,那么最简单的解决方案是通过在终端中键入以下命令来调用测试:

python -m pytest

虽然在OP示例中只运行pytest会失败,但是python -m pytest可以正常工作,正如文档所示
...通过python调用也会将当前目录添加到sys. path。
希望能有所帮助!

daolsyd0

daolsyd03#

您可以将源文件放在根目录中,并按如下方式调整导入路径:

主文件.py

# main.py
from stackoverflow.b import triplicate

def duplicate(x):
        return x * 2

B.py

# b.py
def triplicate(x):
        return x * 3

测试主文件.py

# test_main.py
from stackoverflow.main import duplicate

def test_duplicate():
        assert duplicate(2) == 4

然后从根目录stackoverflow运行pytest .

collected 1 item

tests\test_main.py .                                                                                                                                                                      [100%] 

====================================================================================== 1 passed in 0.03s =======================================================================================

或者,如果您希望保留src文件夹,则导入如下:

from stackoverflow.src.b import triplicate

相关问题