如何在不安装包的情况下运行测试?

时间:2014-06-01 22:03:50

标签: python pytest

我有一些Python包和一些测试。文件在http://pytest.org/latest/goodpractices.html#choosing-a-test-layout-import-rules

之后布局
  

将测试放入实际应用程序之外的额外目录中   代码,如果您有许多功能测试或其他原因,则非常有用   希望将测试与实际应用程序代码分开(通常是好的   想法):

setup.py   # your distutils/setuptools Python package metadata
mypkg/
    __init__.py
    appmodule.py
tests/
        test_app.py

我的问题是,当我运行测试py.test时,我收到错误

  

ImportError:没有名为' mypkg'

的模块

我可以通过安装软件包python setup.py install来解决这个问题,但这意味着测试是针对安装的软件包而不是本地软件包运行的,这使得开发非常繁琐。每当我进行更改并希望运行测试时,我需要重新安装,否则我正在测试旧代码。

我该怎么办?

3 个答案:

答案 0 :(得分:8)

正常的开发方法是使用virtualenv并在virtualenv中使用pip install -e .(这几乎等同于python setup.py develop)。现在,您的源目录将用作sys.path上的已安装包。

当然还有很多其他方法可以让你的软件包在sys.path上进行测试,请参阅Ensuring py.test includes the application directory in sys.path以获得更完整答案的问题。

答案 1 :(得分:2)

我知道这个问题已经结束,但是我经常使用的一种简单方法是从根(包的父级)通过pytest调用python -m

$ python -m pytest tests

之所以可行,是因为-m选项将当前目录添加到python路径,因此mypkg被检测为本地软件包(而不是已安装的软件包)。

请参阅: https://docs.pytest.org/en/latest/usage.html#calling-pytest-through-python-m-pytest

答案 2 :(得分:-1)

使用from .. import mypkg导入包。为此,您需要将(空)__init__.py个文件添加到tests目录和包含目录中。 py.test应该照顾其余部分。