在python中测试while循环

时间:2014-10-07 19:03:53

标签: python testing

测试类似

的方法的最佳方法是什么?
class Foo(object):

   is_running = False
   def run(self):
       self.is_running = True
       while self.is_running:
           do_some_work()

这是消费者非常标准的代码,在设置is_running标志时可以正常工作。

但这很难测试,因为它会进入循环并且永远不会出现,除非我创建第二个线程将is_running更改为false。

是否有任何好的策略可以在不启动单独的线程来运行代码的情况下进行测试?

我还没有看到任何东西,但我想也许模拟库会提供每次[True, True, False]读取时都能返回is_running的功能,但这需要我改变{{1}从成员变量到属性或方法?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,我认为使用线程测试此方法是一种非常可行的方法,可能是最好的解决方案。但是,如果您真的想避开线程,可以将is_running转换为property,然后使用mock.PropertyMock模拟property

import mock
import time

class Foo(object):

   def __init__(self):
       self._is_running = False

   @property
   def is_running(self):
       return self._is_running

   @is_running.setter
   def is_running(self, val):
       self._is_running = val 

   def run(self):
       self._is_running = True  # Don't go through the property here.
       while self.is_running:
           print("in here")
           time.sleep(.5)


with mock.patch('__main__.Foo.is_running', new_callable=mock.PropertyMock,
                side_effect=[True, True, False]) as m:
    f = Foo()
    f.run()

输出:

in here
in here
<done>

我会说,为了实现特定的测试方法,改变你的生产实现这一点并不值得。只需让你的测试函数创建一个线程,在一段时间后设置is_running