pytest集成 - 如何正确导入

时间:2016-10-29 11:52:31

标签: python python-import pytest

我正在使用py.test来测试我的python代码。我项目的相关结构是

-myproject
    file.py
    file2.py
    -test/
        input.txt
        input2.dat
        test_part.py
    -regress/
        file2_old.py
        __init__.py
        -test/
            test_file2_regression.py

test_part.py导入filefile2以及test_file2_regression.py导入file2regress.file2_old。如果我在控制台中运行pytest,则会收到导入错误,导致包不存在。另一方面,运行python -m pytest非常合适,但只有当我从myproject/目录运行它时才会运行。

这样做的正确方法是什么,让它在项目的任何地方运行?我已经尝试修改PYTHONPATH但我真的不知道如何正确地做到这一点。

更多信息:

我没有任何设置文件,我的__init__只是空文件。如果需要操纵PYTHONPATH,则需要相对于myproject进行操作,因为我在多台机器上使用它。我正在运行python 2.7。

我已经退房了:

但它并没有真正帮助我。

2 个答案:

答案 0 :(得分:2)

与项目中任何目录的pytest命令一起使用的解决方案是在test*.py文件中的导入之前包含:

import os
from sys import path
PATH = os.path.abspath(os.path.dirname(__file__))
path.append(os.path.join(PATH, os.pardir, os.pardir))

使用适当数量的os.pardir导航到项目目录,__init__.py文件允许导入模块。

argv[0]inspect.getsourcefile都没有提供必要的信息。 argv[0]包含已使用的py.test模块的位置,而getsourcefile方法只返回None

答案 1 :(得分:1)

在搜索“最好的方法”时遇到了同样的问题和类似的成功,我总结了自己尽可能避免这种情况(通过从顶层运行实际脚本),但回答你的问题,我当前的方法(例如从并行文件夹进行单元测试)是

from sys import argv, path
from os.path import dirname, join
path.append(join(dirname(argv[0]), ".."))

这使得解释器还可以在上面启动脚本的文件夹中进行搜索。另一种方法(而不是使用argv)是使用introspect模块来获取文件名。这些对我来说比使用__file__更好,因为后者并不总是被定义。

编辑29.10。: argv[0]的替代方法是使用

from inspect import getsourcefile
from sys import path
from os.path import dirname, join

this_file = getsourcefile(lambda _: None)
path.append(join(dirname(this_file), ".."))

我希望这至少可以满足要求的目的,另请参阅How do I get the path of the current executed file in Python?

最简单的 - 如果它适用于您的情况 - 当然是:

from os.path import dirname, join
path.append(join(dirname(__file__), ".."))