- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数,我正在为使用 pytest 编写单元测试。唯一的问题是,因为我正在为同一个函数编写多个测试,所以有几个测试因为 cachetools.ttl_cache 装饰器而失败。这个装饰器使函数在每次运行时都返回相同的值,这会扰乱测试。这个装饰器不存在于我正在测试的函数中,而是存在于我正在测试的函数调用的函数中。我无法从我正在测试的函数中删除这个装饰器。这是测试:
@patch('load_balancer.model_helpers.DBSession')
def test_returns_true_if_split_test_is_external(self, dbsession, group_ctx):
group_ctx.group_id = '{}-{}'.format('2222222222', '123456789')
split_test = Mock()
split_test.state = 'external'
config = {
'query.return_value.filter.return_value.first.return_value': split_test
}
dbsession.configure_mock(**config)
assert group_ctx.is_in_variation_group('foo') == True
下面是要测试的函数:
def is_in_variation_group(self, split_test=None):
try:
split_test = get_split_test(split_test) # This function has the
#decorator
log.info('Split test {} is set to {}'.format(split_test.name,
split_test.state))
if not split_test or split_test.state == 'off':
return False
phone_number = int(self.group_id.split('-')[0])
if split_test.state == 'internal':
return True if str(phone_number) in INTERNAL_GUINEA_PIGS else False
if split_test.state == 'external':
return True if phone_number % 2 == 0 else False
except Exception as e:
log.warning("A {} occurred while evaluating membership into {}'s variation "
"group".format(e.__class__.__name__, split_test))
获取拆分测试函数:
@cachetools.ttl_cache(maxsize=1024, ttl=60)
def get_split_test(name):
return (DBSession.query(SplitTest)
.filter(SplitTest.name == name)
.first())
我怎样才能忽略这个缓存装饰器?非常感谢任何帮助
最佳答案
我建议在每次测试运行后清除函数的缓存。
cachetools documentation没有提到这个,但是来自the source code缓存装饰器似乎公开了一个 cache_clear
函数。
对于您正在测试的示例代码:
import cachetools.func
@cachetools.func.ttl_cache(maxsize=1024, ttl=60)
def get_split_test(name):
return (DBSession.query(SplitTest)
.filter(SplitTest.name == name)
.first())
这将是我的方法(假设 pytest >= 3,否则使用 yield_fixture
装饰器):
@pytest.fixture(autouse=True)
def clear_cache():
yield
get_split_test.cache_clear()
def test_foo():
pass # Test your function like normal.
clear_cache
fixture 使用每次测试后自动使用的 yield fixture (autouse=True
) 来执行每次测试后的清理。您也可以使用 the request
fixture and request.addfinalizer
运行清理功能。
关于python - Pytest 单元测试失败,因为目标函数具有 cachetools.ttl_cache 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45458677/
我有一个函数,我正在为使用 pytest 编写单元测试。唯一的问题是,因为我正在为同一个函数编写多个测试,所以有几个测试因为 cachetools.ttl_cache 装饰器而失败。这个装饰器使函数在
我是一名优秀的程序员,十分优秀!