首页 > 解决方案 > 如何使路径能够在 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 对我无法在“主”控制台应用程序中复制的路径加载做了什么。当然,我并不真正关心加法器库,我只是针对最小的可重现问题。

标签: python-3.xpytest

解决方案


pytest有一个相当复杂的机制来添加一些目录PYTHONPATH并允许测试自动运行(参见文档

当您不使用时pytest,您没有此机制,您必须PYTHONPATH自己管理。


为什么 PYTHONPATH 在您的情况下不正确?

当您使用 运行模块python path/to/module.py时,解释器会path/toPYTHONPATH.

在您的情况下,您运行并且解释器将目录python test/mytest_outside_pytest.py的绝对路径添加到.testPYTHONPATH

您可以通过在模块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 ...按照评论中的建议使用(不要忘记在这种情况下,您必须指定一个模块,而不是路径,并记住它只能在包含mylibtest包的目录中工作):

python -m test.mytest_outside_pytest

在这两种情况下,调试会话都可以显示根目录和test目录位于PYTHONPATH


推荐阅读