证明代码的单元测试避免了无限循环
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 值、对象状态的变化或异常——测试代码可以检查这些结果。永远不会完成执行的代码不太适合此范例,但您可以采用一些方法。
在你的测试中,在线程中执行方法;在主线程中,定期检查测试 运行 的时间,如果 运行 的时间太长则引发 AssertionError
。
如果可能,请以不需要潜在无限循环的方式设计代码。例如,您可以使用 for 循环来保证完成:
for x in range(attempts):
if can_we_break_now():
break
- 如果您的用例要求
attempts
在循环内发生变异,请尝试将变异代码提取到函数中并编写测试以证明该函数不能为 attempts
分配非法值.
我越来越擅长 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 值、对象状态的变化或异常——测试代码可以检查这些结果。永远不会完成执行的代码不太适合此范例,但您可以采用一些方法。
在你的测试中,在线程中执行方法;在主线程中,定期检查测试 运行 的时间,如果 运行 的时间太长则引发
AssertionError
。如果可能,请以不需要潜在无限循环的方式设计代码。例如,您可以使用 for 循环来保证完成:
for x in range(attempts): if can_we_break_now(): break
- 如果您的用例要求
attempts
在循环内发生变异,请尝试将变异代码提取到函数中并编写测试以证明该函数不能为attempts
分配非法值.