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

2024-04-24 16:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python上做得越来越好,但我想找到一种方法来证明一段代码不是在无限循环中的。假设我有一个foo()方法,它有一个无限循环和一个每次递减的参数尝试。如果循环在尝试次数达到零时中断,我是黄金级的,但万一我在代码中留下了一个bug,它将永远循环。例如,假设我意外地增加而不是减少,那么单元测试有没有办法检测到无限循环并使测试失败?就像处理器上的看门狗,它检测一个进程是否占用了所有的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??

Tags: ofthe方法代码testself证明loop
1条回答
网友
1楼 · 发布于 2024-04-24 16:26:48

单元测试通常依赖于被测代码来创建某种可观察的结果,例如返回值、对象状态的变化或异常,这些结果可以由测试代码检查。永远无法完成执行的代码不容易适应这种范式,但是有几种方法可以采用。在

  1. 在测试中,在线程中执行该方法;在主线程中,定期检查测试运行了多长时间,如果运行时间过长,则引发一个AssertionError

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

  3. 如果您的用例要求在循环中对attempts进行变异,请尝试将变异代码提取到一个函数中,并编写测试来证明该函数不能将非法值赋给attempts。在

相关问题 更多 >