Mat*_*odd 194 python unit-testing pytest
我使用easy_install在mac上安装pytest并开始为具有文件结构的项目编写测试,如下所示:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
Run Code Online (Sandbox Code Playgroud)
py.test在repo目录中运行时,一切都按预期运行
但是当我在linux或windows上尝试相同的东西时(两者都有pytest 2.2.3),每当它从我的应用程序路径首次导入某些东西时就会吠叫.比如说from app import some_def_in_app
我是否需要编辑我的PATH才能在这些系统上运行py.test?有没有人经历过这个?
Apt*_*ryx 236
我不确定为什么py.test不会在PYTHONPATH本身中添加当前目录,但这是一个解决方法(从存储库的根目录执行):
python -m pytest tests/
Run Code Online (Sandbox Code Playgroud)
它的工作原理是因为Python为您添加了PYTHONPATH中的当前目录.
Aro*_*zon 109
我有同样的问题.我通过__init__.py在我的tests目录中添加一个空文件来修复它.
hoe*_*ing 105
conftest 解最小侵入性的解决方案是添加一个名为的空文件conftest.py的repo/目录:
$ touch repo/conftest.py
Run Code Online (Sandbox Code Playgroud)
而已.无需编写自定义代码来修改sys.path或记住拖动PYTHONPATH,或放入__init__.py不属于它的dirs.
之后的项目目录:
repo
??? conftest.py
??? app.py
??? settings.py
??? models.py
??? tests
??? test_app.py
Run Code Online (Sandbox Code Playgroud)
pytest查找conftest测试集合上的模块以收集自定义挂钩和夹具,并且为了从中导入自定义对象,pytest将其父目录添加conftest.py到sys.path.
如果您有其他项目结构,请将其repo放在包根目录(包含包但不包含自身的包,但不包含包conftest.py)中,例如:
repo
??? conftest.py
??? spam
? ??? __init__.py
? ??? bacon.py
? ??? egg.py
??? eggs
? ??? __init__.py
? ??? sausage.py
??? tests
??? test_bacon.py
??? test_egg.py
Run Code Online (Sandbox Code Playgroud)
用同样的方法__init__.py布局:发生src在src目录:
repo
??? src
? ??? conftest.py
? ??? spam
? ? ??? __init__.py
? ? ??? bacon.py
? ? ??? egg.py
? ??? eggs
? ??? __init__.py
? ??? sausage.py
??? tests
??? test_bacon.py
??? test_egg.py
Run Code Online (Sandbox Code Playgroud)
当然,conftest.py模块不仅仅是一些帮助源代码发现的文件; 它是src框架的所有项目特定增强和测试套件定制的所在.src有很多关于PYTHONPATH分散在整个文档中的模块的信息; 开头src:本地每目录插件
另外,SO对src模块有一个很好的问题:在py.test中,conftest.py文件有什么用?
Not*_*fer 77
是的,如果你cd到tests目录,源文件夹不在Python的路径中.
你有2个选择:
手动将路径添加到测试文件,如下所示:
import sys, os
myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '/../')
Run Code Online (Sandbox Code Playgroud)使用env var运行测试PYTHONPATH=../.
Ste*_*ina 39
将pytest自身作为模块运行:
python -m pytest tests
For*_*Guo 37
您可以在项目根目录中使用PYTHONPATH运行
PYTHONPATH=. py.test
Run Code Online (Sandbox Code Playgroud)
或者使用pip install作为可编辑导入
pip install -e . # install package using setup.py in editable mode
Run Code Online (Sandbox Code Playgroud)
小智 22
我在 Flask 中遇到了同样的问题。
当我添加:
__init__.py
Run Code Online (Sandbox Code Playgroud)
到测试文件夹,问题消失了:)
可能应用程序无法将文件夹测试识别为模块
Jef*_*ald 21
我创建这个作为你的问题的答案和我自己的困惑.我希望它有所帮助.注意py.test命令行和tox.ini中的PYTHONPATH.
https://github.com/jeffmacdonald/pytest_test
具体来说:你必须告诉py.test和tox在哪里找到你所包含的模块.
使用py.test,你可以这样做:
PYTHONPATH=. py.test
Run Code Online (Sandbox Code Playgroud)
使用tox,将其添加到tox.ini中:
[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
PYTHONPATH = {toxinidir}
Run Code Online (Sandbox Code Playgroud)
有点遗憾的是,这是 Python 中的一个问题......但仅添加这个环境变量是最舒服的方法,IMO:
export PYTHONPATH=$PYTHONPATH:.
Run Code Online (Sandbox Code Playgroud)
ConftestImportFailure: ImportError('No module named ...当我不小心将__init__.py文件添加到我的src目录(不应该是Python包,只是所有源的容器)时,我开始得到奇怪的错误.
我在遵循 Flask 教程时遇到了同样的问题,我在官方 Pytest文档中找到了答案 这与我(以及我认为许多其他人)习惯做事的方式略有不同。
您必须setup.py在项目的根目录中创建一个至少包含以下两行的文件:
from setuptools import setup, find_packages
setup(name="PACKAGENAME", packages=find_packages())
Run Code Online (Sandbox Code Playgroud)
其中 PACKAGENAME 是您的应用程序的名称。然后你必须用pip安装它:
pip install -e .
Run Code Online (Sandbox Code Playgroud)
该-e标志告诉 pip 以可编辑或“开发”模式安装包。因此,下次运行pytest它时应该会在标准PYTHONPATH.
| 归档时间: |
|
| 查看次数: |
138800 次 |
| 最近记录: |