我使用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?有没有人经历过这个?
我希望我的测试文件夹与我的应用程序代码分开。我的项目结构是这样的
myproject/
myproject/
myproject.py
moduleone.py
tests/
myproject_test.py
Run Code Online (Sandbox Code Playgroud)
我的项目.py
from moduleone import ModuleOne
class MyProject(object)
....
Run Code Online (Sandbox Code Playgroud)
myproject_test.py
from myproject.myproject import MyProject
import pytest
...
Run Code Online (Sandbox Code Playgroud)
我使用myproject.myproject
因为我使用命令
python -m pytest
Run Code Online (Sandbox Code Playgroud)
从项目根目录 ./myproject/
但是,然后这些模块中的导入失败
E ModuleNotFoundError: 没有名为“moduleone”的模块
我正在运行 Python 3.7 并已阅读自 3.3 以来,__init__
不再需要空文件,这意味着我的项目成为隐式命名空间包
但是,我尝试在其中添加__init__.py
文件myproject/myproject/
并尝试在其中添加conftest.py
文件myproject/
但都不起作用
我已经阅读了一些答案,这些答案说要弄乱路径,然后在其他问题中投票说不要。
什么是正确的方法,我错过了什么?
编辑;
可能相关,我使用 arequirements.txt
使用 pip 安装 pytest。这可能有关系吗?如果是这样,在这种情况下安装 pytest 的正确方法是什么?
编辑2:
其中的路径之一sys.path …
已经 有人对此主题提出疑问。有时程序员会__init__.py
在某些地方放置一些路径,通常有人说应该使用绝对路径。但是,我无法让它在这里工作:
如何从包中导入类以便 pytest 中的测试运行并可以使用代码?
\n目前我得到 pytest 或通过各自运行的代码。
\n我的示例项目结构是
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 testingonly\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testingonly.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_testingonly.py\n
Run Code Online (Sandbox Code Playgroud)\n__init__.py
在这两种情况下都是空文件。
$ cat testingonly/cli.py\n"""Console script for testingonly."""\nfrom testingonly import Tester\n\ndef main(args=None):\n """Console script for testingonly."""\n te = Tester()\n return 0\n\nmain()\n
Run Code Online (Sandbox Code Playgroud)\n$ cat testingonly/testingonly.py\n"""Main module."""\nclass Tester():\n def __init__(self):\n print("Hello")\n
Run Code Online (Sandbox Code Playgroud)\n正如预期的那样:
\n$ python3 testingonly/cli.py\nHello\n
Run Code Online (Sandbox Code Playgroud)\n然而,尝试测试这一点失败了:
\n$ pytest\n========================================================= test session starts =========================================================\nplatform linux -- …
Run Code Online (Sandbox Code Playgroud)