【发布时间】:2011-11-07 02:38:06
【问题描述】:
我正在尝试围绕 py.test 建立一个不错的基础
我们的一些测试需要某些测试数据才能工作。
今天我们只是指定一个模拟对象作为函数参数并在生成器中进行设置,这显然是不可取的。
下面是它今天的样子的一个例子:
def test_something(self, some_data):
# some_data is unused in the test
我想做这样的事情:
@uses_some_data
def test_something(self):
# The data is loaded when the test is run
虽然我还没有弄清楚如何正确地做到这一点。
我不能使用类设置,因为我希望数据在整个会话中保持不变,而不是在每个测试类中设置/删除。
我的第一个想法是仍然使用 funcargs,但不是让测试拥有 funcarg,而是让装饰器为函数请求 funcarg,基本上隐藏了丑陋。
问题在于我需要一个 py.test 对象来请求一个 funcarg。
有什么办法可以得到这样的对象,或者这是错误的方法吗?
如果收集到的测试都不需要数据,则不必加载数据将是一个很棒的奖励,这是使用装饰器的缺点,因为无论测试是否运行,它们总是运行不是。
【问题讨论】:
-
不确定我是否正确理解了您的问题,可能我遗漏了一些东西。在您的第一个变体“def test_something(self, some_data): ...”中,如果函数体中不需要它,为什么还要在参数中指定“some_data”? funcargs 的要点是,只有在实际需要它们时才指定它们——就像普通的 Python 函数一样——只有在实际使用它们时才需要参数。
-
我们需要基于会话的设置,只有在任何收集的测试需要它们时才会加载。
-
测试函数的 funcarg 只有在执行测试时才会被实例化。在 funcarg 工厂中,您可以使用 cached_setup 来管理每个会话的资源,请参阅pytest.org/latest/…。希望这会有所帮助。
-
是的,这就是我们今天使用的。我的目标是不使用仅用于设置的 funcargs。