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)
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。PYTHONPATHsrcpytestautoenv(Python 库)来启用.env文件的使用来为您管理此内容(至少在设置内virtualenv- 通常是个好主意)。setup.py也是包含许多模块的惯用方法,并且可以为您正在处理的情况提供更方便的路径。