pytest如何查找要测试的文件?

时间:2016-12-05 17:54:32

标签: python pytest

我知道py.test如何发现要运行的测试,但我不知道如何让测试引用包含要测试的代码的文件。

我的项目如下:

arith.py
tests/
    test_airth.py

在我的项目根目录中,我有文件arith.py

def plus(x, y):
    return x + y

在文件tests/test_arith.py中我有

import arith
def test_plus():
    assert arith.plus(3, 5) == 8

当我在项目根目录中运行时,

pytest

它发现了我的测试文件,因为我遵循了测试发现规则。但是pytest回复了

  导入测试模块测试时导入错误/ test_arith.py'

我从项目根运行pytest,为什么它不喜欢我的导入?它想要在tests目录中找到我正在测试的文件!

如何正确设置导入,以便tests/目录中的测试文件能够看到项目根目录下的测试文件? (pytest的文档中的示例似乎没有做任何特别的事情......也许测试与被测试的文件位于同一目录中?它们详细描述了测试发现,但我一定错过了如何设置测试,以便他们可以看到他们正在测试的代码。)

1 个答案:

答案 0 :(得分:3)

假设你有这样的布局(我就是这样做):

.
├── myprogram
│   ├── __init__.py
│   ├── core.py
│   └── db.py
├── setup.py
└── tests
    ├── test_core.py
    └── test_db.py

你应该像这样调用pytest:

py.test tests

我很确定这是test目录的绝对/相对路径。这也假设您在根目录中执行了类似python -m pip install -e .的操作。你也有.git.hg文件夹:)

  

这有点奇怪,需要这么多。当然有更好的方法吗?

实际上最好的方式。我认为分发Python应用程序的最佳方式是Python包,最好是wheel,这并不存在争议。要做到这一点,你可能需要一个setup.py

通过安装您的软件包(最好是在venv / virtualenv沙箱中),您可以确保知道安装/运行您的所需的软件包。如果您的软件包已安装,则意味着执行import myprogram的任何脚本(使用我的示例布局)将能够导入您的软件包。你将在测试套件中做什么。

然后你的测试发现就像告诉pytest在哪里找到它一样简单。