我知道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回复
ImportError while importing test module tests/test_arith.py'
我从项目根目录运行pytest,为什么它不像我的导入一样?它想在tests目录中找到我正在测试的文件!
如何正确设置导入,以便tests/目录中的测试文件可以看到项目根目录中的被测试文件? (pytest文档中的示例似乎并没有做任何特别的事情……也许测试与被测文件位于同一目录中?它们详细描述了测试发现,但我一定错过了如何设置测试的方法,因此它们可以看到他们正在测试的代码。)
假设您有这样的布局(这就是我要做的):
.
├── myprogram
│ ├── __init__.py
│ ├── core.py
│ └── db.py
├── setup.py
└── tests
├── test_core.py
└── test_db.py
您应该像这样调用pytest:
py.test tests
我相当确定这是测试目录的绝对/相对路径。这还假设您在根目录中已执行了python -m pip install -e .之类的操作。而且您也有一个.git或.hg文件夹:)
It's a little strange so much is needed. Surely there is a better way?
其实那是最好的方法。我认为宣布Python应用程序的最佳分发方式是作为Python软件包(最好是轮子)是没有争议的。为此,您可能需要setup.py。
通过安装软件包(最好在venv / virtualenv沙箱中),可以确保您知道安装/运行软件包所需的软件包。如果安装了软件包,则意味着执行import myprogram的任何脚本(使用我的示例布局)都可以导入您的软件包。这就是您在测试套件中要做的事情。
然后,您的测试发现就像告诉pytest在哪里找到一样简单。
真好 有趣的是,我试图分发的是一个文件,客户只需说import thething就可以使用。 香港专业教育学院建立了大型的多文件应用程序,其中pytest是其中的一部分,是的,tests目录是main,models,views,当然还有env的同级文件。 以这种方式打包时,客户会说from models import whatever或import models。 要获得我想要的东西,我想我不仅需要拥有thething.py,还必须使thething成为tests的同级并将所有代码放入thething__init__.py。 它只有几百行...
如果您想提供一些您希望人们导入的东西,那么您肯定要创建一个包-即使它只是一个文件。 您仍然可以使用setup.py进行操作。 如果采用这种方法,则可以在同一文件夹中包含thething.py和tests。