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

Unit test that proves code avoids 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??

单元测试通常依赖于被测代码创建某种可观察的结果——例如 return 值、对象状态的变化或异常——测试代码可以检查这些结果。永远不会完成执行的代码不太适合此范例,但您可以采用一些方法。

  1. 在你的测试中,在线程中执行方法;在主线程中,定期检查测试 运行 的时间,如果 运行 的时间太长则引发 AssertionError

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

  3. 如果您的用例要求 attempts 在循环内发生变异,请尝试将变异代码提取到函数中并编写测试以证明该函数不能为 attempts 分配非法值.