证明代码的单元测试避免了无限循环

时间:2017-04-16 07:48:31

标签: python unit-testing infinite-loop

我在python上越来越好但我想找到一种方法来证明一段代码不在无限循环中。假设我有一个方法foo(),它有一个无限循环和一个参数尝试,每次都会减少。如果在尝试达到零时循环中断我是金色的,但是如果我在代码中留下了一个错误,它将永远循环。例如,假设我意外地增加而不是递减,是否有一种方法可以让单元测试检测无限循环并使测试失败?像处理器上的看门狗一样排序,检测进程是否占用了所有CPU周期。请参阅以下代码:

# Given the following set of methods
def foo(attempts):
  while(attempts >= 0)
    attempts += 1 # OH OH!! ACCIDENTAL INFINITE LOOP!!!!
    # Keep doing work until attempts reaches zero (or so was expected...)

  return True # return true once broken out of the loop


# Here comes the Unit test
class FooTestCase(unittest.TestCase):
  def test_foo(self):
    self.assertTrue(foo(5)) # Test foo - but how to test that an inf loop is not present??

1 个答案:

答案 0 :(得分:0)

单元测试通常依赖于测试中的代码来创建某种可观察的结果 - 返回值,对象状态的变化或例如 - 可以由测试代码检查。从未完成执行的代码并不适合这种范例,但您可以采取一些方法。

  1. 在测试中,在线程中执行该方法;在主线程中,定期检查测试运行的时间,如果测试运行的时间过长,则提出AssertionError

  2. 如果可能,请以不需要无限循环的方式设计代码。例如,您可以使用for循环以确保完成: for x in range(attempts): if can_we_break_now(): break

  3. 如果您的用例要求在循环中突变attempts,请尝试将突变代码提取到函数中并编写测试以证明函数不能将非法值赋给attempts。< / LI>