我被这个非常愚蠢的错误所困扰。我正在尝试使用 bluepy 在 Raspberry Pi 上运行 pytest。
pi@pi:~/bluepy/bluepy $ pytest test_asdf.py
============================= test session starts ==============================
platform linux2 -- Python 2.7.9, pytest-3.0.7, py-1.4.33, pluggy-0.4.0
rootdir: /home/pi/bluepy, inifile:
collected 0 items / 1 errors
==================================== ERRORS ====================================
______________ ERROR collecting bluepy/test_bluetoothutility.py _______________
ImportError while importing test module '/home/pi/bluepy/bluepy/test_asdf.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test_asdf:4: in <module>
from asdf import AsDf
asdf.py:2: in <module>
from bluepy.btle import *
E ImportError: No module named btle
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.65 seconds ============================
Run Code Online (Sandbox Code Playgroud)
我意识到我的问题可能是 rootdir 显示的路径不正确。它应该是
/home/pi/bluepy/bluepy
Run Code Online (Sandbox Code Playgroud)
我一直在阅读pytest 文档,但我不知道如何更改 rootdir。
Cur*_*son 10
你的问题与 Pytest 的 rootdir 无关。
Pytest 中的 rootdir 与构建测试包名称的方式无关sys.path,并且 rootdir 未添加到 中,正如您从遇到的问题中看到的那样。(注意:被认为是 rootdir 的目录可能由于其他原因被添加到路径中,例如当您运行时它也是当前工作目录python -m pytest。)
正如其他人所描述的,这里的问题是顶级bluepy/不在sys.path. 如果您只想让自己以交互方式运行某些东西,最简单的处理方法是按照Cecil Curry 的回答:cd到顶级bluepy并运行 Pytest 作为python -m pytest bluepy/test_asdf.py(或者只是python -m pytest如果您希望它发现test_*当前目录中或下的所有文件并运行它们)。但我认为您需要使用python -m pytest,而不仅仅是pytest,以确保当前工作目录在路径中。
如果您希望设置一个其他人可以轻松运行而不会出现此类神秘故障的测试框架,您将需要设置一个测试脚本来设置当前工作目录PYTHONPATH或其他适当的内容。或使用tox. 或者只是使用可以为您运行测试的标准工具使其成为 Python 包。(所有这些都超出了这个问题的范围。)
顺便说一句,我同意 Cecil 对Mackie Messer 回答的看法;瞎搞与conftest.py这样的过于艰难和脆弱; 几乎在任何情况下都有更好的解决方案。
附录:rootdir的使用
据我所知,只有两件事可以使用 rootdir:
.pytest_cache/除非另外指定(使用cache_dir配置选项),否则该目录存储在 rootdir 中。conftest.py,它将始终被加载,即使没有从 rootdir 内部或之下加载测试文件。该文档声称 rootdir 也用于生成 nodeid,但添加了一个conftest.py包含
def pytest_runtest_logstart(nodeid, location):
print("logstart nodeid={} location={}".format(nodeid, location))
Run Code Online (Sandbox Code Playgroud)
并且运行pytest --rootdir=/somewhere/way/outside/the/tree表明这是不正确的(尽管节点位置是相对于 rootdir 的)。
我的第一个猜测是你在 python 路径中没有那个目录。您可以将其动态添加到 python 路径中。一种简单的方法是在测试配置文件中conftest.py,我相信它总是在测试发现和测试运行之前执行。
例如,您可能有一个项目设置,如:
root
+-- tests
| +-- conftest.py
| +-- tests_asdf.py
+-- bluepy (or main project dir)
| +-- miscellaneous modules
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以将根目录添加到conftest.py文件中的python 路径中,如下所示:
root
+-- tests
| +-- conftest.py
| +-- tests_asdf.py
+-- bluepy (or main project dir)
| +-- miscellaneous modules
Run Code Online (Sandbox Code Playgroud)
让我知道这是否有帮助。
| 归档时间: |
|
| 查看次数: |
20567 次 |
| 最近记录: |