我知道 py.test 如何发现要运行的测试,但我不知道如何使测试引用包含要测试的代码的文件。
我的项目是这样的:
arith.py
tests/
test_airth.py
Run Code Online (Sandbox Code Playgroud)
在我的项目的根目录,我有一个文件arith.py用
def plus(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
在tests/test_arith.py我有的文件中
import arith
def test_plus():
assert arith.plus(3, 5) == 8
Run Code Online (Sandbox Code Playgroud)
当我运行时,在项目根目录中,
pytest
Run Code Online (Sandbox Code Playgroud)
它会发现我的测试文件,因为我遵循了测试发现规则。但是 pytest 回复
导入测试模块时出现导入错误 tests/test_arith.py'
我pytest从项目根运行,为什么它不喜欢我的导入?它想在tests目录中找到我正在测试的文件!
如何正确设置导入,以便目录中的测试文件tests/可以看到项目根目录中的被测文件?(pytest 文档中的示例似乎没有做任何特别的事情......也许测试与被测文件在同一目录中?他们非常详细地描述了测试发现,但我一定错过了如何设置测试,所以他们可以看到他们正在测试的代码。)
假设您有这样的布局(这就是我所做的):
.
??? myprogram
? ??? __init__.py
? ??? core.py
? ??? db.py
??? setup.py
??? tests
??? test_core.py
??? test_db.py
Run Code Online (Sandbox Code Playgroud)
你应该像这样调用 pytest :
py.test tests
Run Code Online (Sandbox Code Playgroud)
我很确定这是测试目录的绝对/相对路径。这还假设您已经python -m pip install -e .在根目录中执行了类似的操作。你也有一个.gitor.hg文件夹:)
这有点奇怪,所以需要这么多。当然有更好的方法吗?
其实这是最好的办法。我不认为声明分发 Python 应用程序的最佳方式是作为 Python 包,最好是wheel是没有争议的。为此,您可能需要一个setup.py.
通过安装您的软件包(最好在 venv/virtualenv 沙箱中),您可以确保您知道安装/运行您的. 如果您的包已安装,则意味着任何脚本import myprogram(使用我的示例布局)都可以导入您的包。这就是您将在测试套件中执行的操作。
那么你的测试发现就像告诉 pytest 在哪里找到它一样简单。