gpt4 book ai didi

python - Py.test - 基于 session 的设置

转载 作者:行者123 更新时间:2023-12-01 06:05:46 26 4
gpt4 key购买 nike

我正在尝试围绕 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

虽然我还没有弄清楚如何正确地做到这一点。

我无法使用类设置,因为我希望数据在整个 session 中保持不变,而不是在每个测试类上设置/拆除。

我的第一个想法是仍然使用 funcargs,但我们不让测试拥有 funcarg,而是让装饰器请求函数的 funcarg,基本上隐藏了丑陋。

问题是我需要一个 py.test 对象来请求 funcarg。
有什么方法可以得到这样的对象,或者这是错误的方法吗?

如果收集的测试都不需要数据,则不必加载数据,这将是一个很棒的奖励,这是使用装饰器的缺点,因为无论测试是否运行,它们总是运行不是。

最佳答案

这里有一些可能可以按原样工作的东西,如果不能的话,希望能为您指明正确的方向。

class TestData(object):
def __getattr__(self, name):
if name not in ('data1', 'data2', 'data3'):
raise AttributeError("TestData has no %s" % name)
if name == 'data1':
result = self._generate_data('data1')
setattr(self.__class__, name, result)
elif name == 'data2':
result = self._generate_data('data2')
setattr(self.__class__, name, result)
elif name == 'data3':
result = self._generate_data('data3')
setattr(self.__class__, name, result)
return result
def _generate_data(self, data_name):
return data_name * int(data_name[-1])

TestData 类使用 __getattr__ 方法生成所需的数据,并通过将生成的日期保存回类(而不是实例!),数据将保留以供将来使用也可以使用。

class uses_some_data(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
global test_data
test_data = TestData()
return self.func(*args, **kwargs)

一个简单的装饰器,用于设置 test_data 的全局名称绑定(bind)。事实上,这个版本的装饰器非常简单,可以轻松地用 test_data = TestData() 的模块级名称绑定(bind)替换。

@uses_some_data
def testing_test():
print(test_data.data2)

还有一个测试函数。

如果您不喜欢 test_data 的全局级别,您可以更喜欢装饰器并将 test_data 分配给函数本身:

class uses_some_data(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
self.func.test_data = TestData()
return self.func(*args, **kwargs)

在这种情况下,请确保您的测试函数引用自身

@uses_some_data
def testing_test():
print(testing_test.test_data.data2)

关于python - Py.test - 基于 session 的设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com