我使用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?有没有人经历过这个?
我使用的是Python 3.5.1.我在这里阅读了文档和包部分:https://docs.python.org/3/tutorial/modules.html#packages
现在,我有以下结构:
/home/wujek/Playground/a/b/module.py
Run Code Online (Sandbox Code Playgroud)
module.py:
class Foo:
def __init__(self):
print('initializing Foo')
Run Code Online (Sandbox Code Playgroud)
现在,在/home/wujek/Playground:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Run Code Online (Sandbox Code Playgroud)
同样,现在在家里,超级文件夹Playground:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
Run Code Online (Sandbox Code Playgroud)
实际上,我可以做各种各样的事情:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我虽然有被需要的__init__.py文件(空的都可以)两种a,并b为module.py要导入的时候Python的路径指向Playground文件夹?
这似乎已经从Python 2.7改变了:
~ $ PYTHONPATH=Playground …Run Code Online (Sandbox Code Playgroud) 这个问题与以下问题有关,但在那里没有回答:
我有一个python模块具有以下树结构:
mcts
|- setup.py
|- mcts
|- __init__.py
|- uct.py
|- toy_world_state.py
|- test
|- test_uct.py
|- test_toy_world_state.py
Run Code Online (Sandbox Code Playgroud)
我在某个目录中创建了virtualenv
$ mkdir virtual
$ virtualenv --system-site-packages virtual
$ source virtual/bin/activate
Run Code Online (Sandbox Code Playgroud)
然后我安装我的包:
$ cd /path/to/mcts
$ pip install -e .
Run Code Online (Sandbox Code Playgroud)
现在我尝试运行测试:
$ py.test mcts
================================================== test session starts ==================================================
platform linux -- Python 3.4.2 -- py-1.4.26 -- pytest-2.6.4
collected 0 items / 2 errors
======================================================== ERRORS =========================================================
__________________________________ ERROR collecting mcts/test/test_toy_world_state.py ___________________________________
mcts/test/test_toy_world_state.py:4: in <module>
from mcts.toy_world_state import * …Run Code Online (Sandbox Code Playgroud) 已经 有人对此主题提出疑问。有时程序员会__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\nRun 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()\nRun Code Online (Sandbox Code Playgroud)\n$ cat testingonly/testingonly.py\n"""Main module."""\nclass Tester():\n def __init__(self):\n print("Hello")\nRun Code Online (Sandbox Code Playgroud)\n正如预期的那样:
\n$ python3 testingonly/cli.py\nHello\nRun Code Online (Sandbox Code Playgroud)\n然而,尝试测试这一点失败了:
\n$ pytest\n========================================================= test session starts =========================================================\nplatform linux -- …Run Code Online (Sandbox Code Playgroud)