在记忆化函数周围进行Python测试

4 投票
2 回答
1144 浏览
提问于 2025-04-20 10:28

我正在做一些测试,发现当我把它们一起运行时,有些测试会失败。经过调查,我发现问题出在我们对系统调用的缓存上。

因为我在模拟系统调用,而不是缓存的函数,所以这个函数只计算一次,这样就把信息泄露到了后面的测试中。

处理缓存函数的优雅方法有哪些呢:

  • 模拟这些缓存的函数,而不是系统调用
  • 给缓存函数加一个参数,让它在测试时不工作
  • 模拟缓存装饰器,让它返回参数
  • 找到数据被缓存的地方,并在每个测试结束时清理它

还有其他想法吗?

谢谢

2 个回答

0

试试用 MagicMock 代替普通的 Mock

假设你的代码是这样的:

@memoize.Memoize()
def OAuthClient():
    """Returns an Oauth client."""
    return 'blah'

Mock 这样模拟:

mymodule.OauthPasswordClient = mock.Mock()

会返回这样的错误:

TypeError: unsupported operand type(s) for +=: 'int' and 'Mock'

但是用 MagicMock 这样模拟:

mymodule.OauthPasswordClient = mock.MagicMock()

就能正常工作了。

1

可能有点晚了,但我发现使用 delete_memoized 非常简单:

# your function
@memoize(timeout=50)
def your_long_function():
    # do stuff

# your test
def test_get_folder_content_error_handled(self, flf):
    delete_memoized(your_long_function)
    your_long_function()

我刚在 Django 中用这个方法(使用 django-memoize)试了一下,效果非常好!

撰写回答