我知道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的文档中的示例似乎没有做任何特别的事情......也许测试与被测试的文件位于同一目录中?它们详细描述了测试发现,但我一定错过了如何设置测试,以便他们可以看到他们正在测试的代码。)
答案 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在哪里找到它一样简单。