使用重试逻辑的Python模拟测试过程。在每次重试中创建不同的模拟

时间:2015-05-16 01:18:37

标签: python git unit-testing mocking

背景: 我正在尝试为git测试我的包装类。这个类在挂起或失败时执行重试git命令(我们的回购很大)。我可以用mockproc - https://pypi.python.org/pypi/MockProc/

之类的东西来模拟git

我面临的问题是如何测试重试逻辑,理想情况下我想要的是能够做到这一点 -

@integrationtest('git')
def test_git_fetch(mock_proc):
  mock_proc.add_scripts("sleep (60)",
                        "sleep (60)",
                        "exit (-1)" )
  mygit.fetch()
  assert mock_proc.output_signal_count == 3
  assert mock_proc.get_output_signals[0] == -1

所以在这种情况下,当mygit.fetch()重试git 3次时,每次运行add_scripts函数中定义的脚本。使用mockproc模块,我可以模拟给定脚本的任何命令,但是我很难过如何实现重试测试,以便每次重试都运行不同的脚本。如果有人可以指出一些可以帮助我实现这个目标的模块,或者某种方式来扩展mockproc来添加重试处理,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

我在模拟测试之前遇到过类似的问题。我听到了这个答案,非常有帮助

is there a way to track the number of times a function is called?

一种方法是创建要为其计算属性访问权的实例的代理:

from collections import Counter

class CountingProxy():
    def __init__(self, instance):
        self._instance = instance
        self.count = Counter()

    def __getattr__(self, key):
        if hasattr(self._instance, key):
            self.count[key] += 1
        return getattr(self._instance, key)


>>> l = [1,2,3,4,5]
>>> cl = CountingProxy(l)
>>> cl.pop()
5
>>> cl.append(10)
>>> cl.index(3)
2
>>> cl.reverse()
>>> cl.reverse()
>>> cl.count
Counter({'reverse': 2, 'pop': 1, 'append': 1, 'index': 1})