python-3.x - 如何使路径能够在 pytest 之外运行测试
问题描述
我有一个通过pytest
. 我还有一个相邻的源,它是一个控制台应用程序(不是 pytest),它执行与 barfsModuleNotFoundError
相同的函数调用相同的函数。
mylib/mylib.py:
def adder(num1, num2):
return num1 + num2
测试/my_test.py:
from mylib.mylib import adder
def test_adder():
assert adder(2, 2) == 4
测试/mytest_outside_pytest.py:
from mylib.mylib import adder
print(str(adder(2, 2)))
正如我建议pytest
的那样,完成并表明测试通过,但以下内容没有:
$ python3 test/mytest_outside_pytest.py
Traceback (most recent call last):
File "test/mytest_outside_pytest.py", line 1, in <module>
from mylib.mylib import adder
ModuleNotFoundError: No module named 'mylib'
也没有:
$ cd test/
$ python3 mytest_outside_pytest.py
Traceback (most recent call last):
File "mytest_outside_pytest.py", line 1, in <module>
from mylib.mylib import adder
ModuleNotFoundError: No module named 'mylib'
我__init__.py
在两个文件夹中都有空。我不知道 pytest 对我无法在“主”控制台应用程序中复制的路径加载做了什么。当然,我并不真正关心加法器库,我只是针对最小的可重现问题。
解决方案
pytest
有一个相当复杂的机制来添加一些目录PYTHONPATH
并允许测试自动运行(参见文档)
当您不使用时pytest
,您没有此机制,您必须PYTHONPATH
自己管理。
为什么 PYTHONPATH 在您的情况下不正确?
当您使用 运行模块python path/to/module.py
时,解释器会path/to
在PYTHONPATH
.
在您的情况下,您运行并且解释器将目录python test/mytest_outside_pytest.py
的绝对路径添加到.test
PYTHONPATH
您可以通过在模块import pdb; pdb.set_trace()
的最开始添加mytest_outside_pytest.py
以进入调试会话并运行它来检查它。然后import sys
显示sys.path
以查看这test
是您的PYTHONPATH
.
您还可以看到根目录未列出,因此无法导入其中包含的包。
如何解决?
它可以通过多种方式完成。
PYTHONPATH
您可以在命令中手动定义:
PYTHONPATH=. python test/mytest_outside_pytest.py
或者您可以python -m ...
按照评论中的建议使用(不要忘记在这种情况下,您必须指定一个模块,而不是路径,并记住它只能在包含mylib
和test
包的目录中工作):
python -m test.mytest_outside_pytest
在这两种情况下,调试会话都可以显示根目录和test
目录位于PYTHONPATH
推荐阅读
- azure - 没有 @ 符号的 Azure AD 自定义身份颁发者
- python - matplotlib 和 numpy,问题在 Python 中格式化二维条形图
- google-cloud-functions - 如果删除云功能,发布/订阅消息会被删除吗?
- javascript - 在 Observable 中使用 VegaLite 旋转文本标签
- java - 如何从 RecyclerAdapter 获取数据?
- c++ - 访问用户定义的析构函数已启动但未完成的对象真的是UB吗?
- java - 无法通过 Windows 10 和 DLINK DIR-615 路由器中的 Java 代码获取 DNS 请求
- c# - 为什么会出现编译器错误:无法将 void 转换为字符串,因为没有发生强制转换
- arrays - 从数组中删除对象无法正常工作 - React-dropzone
- javascript - 在网站中阅读文本时创建动态突出显示