首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于使用pytest的Python项目,正确的文件夹结构是什么?

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

Stack Overflow用户
提问于 2021-07-21 21:53:29
回答 2查看 13.4K关注 0票数 10

我尝试使用文件夹结构来组织Python项目。当我需要进行测试时,我使用如下内容。

代码语言:javascript
运行
复制
.
|-- src
|   |-- b.py
|   `-- main.py
`-- tests
    `-- test_main.py

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

到目前为止,我已经尝试将空的__init__.py文件放置在srctests文件夹中,无论是独立的还是一起的,但是其中任何一个似乎都能工作。

在我看来,这是一个相当标准的项目,但我一直未能在网上找到解决方案。我应该使用不同的文件夹结构吗?对于这类项目,有没有推荐使用pytest的方法?

这是文件的内容:

代码语言:javascript
运行
复制
# b.py
def triplicate(x):
        return x * 3
代码语言:javascript
运行
复制
# main.py
from b import triplicate

def duplicate(x):
        return x * 2
代码语言:javascript
运行
复制
# test_main.py
from src.main import duplicate


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

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

代码语言:javascript
运行
复制
==================================================================================================== 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 ===============================================================================================
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-21 23:19:03

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

代码语言:javascript
运行
复制
PYTHONPATH=$PYTHONPATH,../src python test_main.py

这是如果您要从源目录执行测试的话。像IntelliJ (PyCharm)这样的工具将允许您在测试调用中将其作为一个值添加。或者,您可以使用export PYTHONPATH=...。(请注意,这是一个*nix环境,您在windows上的里程可能会有所不同。)

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

  • 有关正确配置这个答案的更多信息,请参见PYTHONPATH
  • 有关如何修改和使用“遮罩下”的这位医生,请参见PYTHONPATH
  • 有关在运行这个答案测试时包含src目录的选项,请参见pytest
  • 请参阅这篇博客文章有关如何使用autoenv (一个Python库)来为您启用.env文件来管理这个问题(至少在virtualenv设置中是一个好主意)。
  • setup.py对于包含许多模块也是惯用的,并且可能为您正在处理的情况提供更方便的路径。
票数 2
EN

Stack Overflow用户

发布于 2021-07-21 23:11:32

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

main.py

代码语言:javascript
运行
复制
# main.py
from stackoverflow.b import triplicate

def duplicate(x):
        return x * 2

b.py

代码语言:javascript
运行
复制
# b.py
def triplicate(x):
        return x * 3

test_main.py

代码语言:javascript
运行
复制
# test_main.py
from stackoverflow.main import duplicate


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

然后从根目录pytest .运行stackoverflow

代码语言:javascript
运行
复制
collected 1 item

tests\test_main.py .                                                                                                                                                                      [100%] 

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

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

代码语言:javascript
运行
复制
from stackoverflow.src.b import triplicate
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68476886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档