【问题标题】:How much should a unit test know about the function it is testing?单元测试应该对它正在测试的功能了解多少?
【发布时间】:2015-01-15 17:14:00
【问题描述】:

我正在为缓存机制编写测试。该机制有两个缓存层,请求缓存和redis。请求缓存使用Flask.g,这是一个在请求期间存储值的对象。它通过在 Flask.g._cache 属性上创建一个字典来做到这一点。

但是,我认为确切的属性是我的单元测试不应该关心的实现细节。我想确保它将其值存储在 Flask.g 上,但我不在乎它是如何做到的。什么是测试这个的好方法?

我正在使用 Python 模拟模块,所以我知道我可以模拟 `Flask.g,但我不确定是否有办法测试它是否有任何属性访问,而不关心哪个它是财产。

对于这样的测试,这甚至是正确的方法吗?

【问题讨论】:

  • 与其在你的测试中查看 cache 的细节,为什么不只是确保 expensive_op_1expensive_op_2not 不止一次被叫?数据被缓存的位置无关紧要(就测试而言) - 是否数据被缓存并重新使用,而不是您想要测试的重新请求。 (还是我误解了你的问题?)
  • 嗯,请求缓存比去redis快很多。

标签: python unit-testing caching flask


【解决方案1】:

如果您正在测试端点,就个人而言,您不应该嘲笑 Flask.g。因为您将创建一个 self.app(我可能不确定这部分)

其次,您需要模拟 redis 客户端,并使用类似返回的结构。

class RedisTestCase(object):
    saved_dictionary = {}
    def keys(self, pattern):
        found_keys = []
        for key in RedisTestCase.saved_dictionary: #loop keys for pattern
            if pattern:
                found_keys.append(key)
        return found_keys

    def delete(self, keys):
        for key in keys:
            if key in RedisTestCase.saved_dictionary:
                del RedisTestCase.saved_dictionary[key]

    def mset(self, items):
        RedisTestCase.saved_dictionary.update(items)

    def pipeline(self):
        return RedisTestCase()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2020-11-17
    • 2011-09-24
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多