如何对一些输入运行到无限循环的方法进行单元测试?

时间:2011-05-11 04:38:15

标签: unit-testing junit tdd nunit infinite-loop

我刚想到这个问题,我想在这里问这个问题。

案例是有意的,我只是写一个无限运行的循环。我如何进行单元测试呢?

我问这个是因为,这种情况可能发生在代码中的任何地方。假设我的方法委托给其他几种方法,我想知道

  • 如何遇到无限循环
  • 什么输入导致它
  • 调用哪种方法(来自此方法)导致此

我没有为此编写代码。问题纯粹是出于知识,如果将来出现这种情况该怎么办。请回复。

4 个答案:

答案 0 :(得分:11)

  

如何对某些输入运行到无限循环的方法进行单元测试?

您可以测试几乎相反的方法:“如何对某个方法进行单元测试,以便该方法对某些输入的运行时间不会超过Xxxx毫秒”。如果此测试失败,您可能已找到具有无限循环的候选者。

NUnit 2.5有TimeoutAttribute,如果测试时间超过给定的毫秒数,则会导致测试失败。

答案 1 :(得分:7)

我希望你的意思是某种消息泵/事件处理循环。 (大多数无限循环都很糟糕。)

我确保循环委托给处理输入的某个类。彻底测试这个课程。

循环结构失效的可能性很小..所以我会通过验收测试或手动测试它。

这有点类似于测试可执行文件的Main函数。这里的诀窍还在于确保主代表服务于一个可测试的类。

答案 2 :(得分:7)

让循环委托循环检查的函数注入依赖项:

interface IShouldLoop
{
    bool ShouldLoop();
}

class ClassToTest
{
    private final IShouldLoop shouldLoop;

    public ClassToTest(IShouldLoop shouldLoop)
    {
        this.shouldLoop = shouldLoop;
    }

    public void MethodToTest()
    {
        while(shouldLoop.ShouldLoop())
        {
            // do whatever
        }
    }
}

您可以测试它每次都将循环检查委派给IShouldLoop依赖项,并且您可以控制测试中的循环,以便它只循环您想要的次数。在生产环境中,使用始终返回true的IShouldLoop实例来实例化它。

答案 3 :(得分:3)

unitesting的目的是测试程序中每个最简单的单元。

最简单的单位通常是一个执行单一任务的函数,所以为了统一你的无限循环,你必须提取这个循环可以在单独调用的单独函数中执行的每个单独任务,一旦完成此操作将能够调用这些函数给它们所有可能的参数,以便测试你的函数应该能够处理的不同的szenarios。作为函数的无限循环不必是单元的,而是它内部的较小任务。