2017-04-16 134 views
1

我在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?? 
+0

...只是让它在那里,你的构建将超时。 –

回答

0

单元测试通常依赖于代码被测建立某种可观察到的结果 - 一个返回值,在对象状态的变化,或者例如一个异常 - 可以由测试被检查码。从来没有完成执行的代码不适合这种范式,但有几种方法可以采用。

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

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

  3. 如果您的使用情况要求attempts在循环中突变,尝试提取突变代码放到一个函数,编写测试,以证明函数不能为attempts分配一个非法值。
+0

我明白了 - 我认为你的主意是我寻找的最接近的东西。我的意思是我相信我可以编写代码,使其不涉及无限循环,但其想法是将代码看作一个黑盒子,而我并不知道它的内部工作原理。 – nndhawan