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

Sha*_*aju 22 tdd junit nunit unit-testing infinite-loop

这个问题刚刚出现在我的脑海里,我想在这里问这个问题.

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

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

  • 它是如何陷入无限循环的
  • 什么输入引起了它
  • 调用哪种方法(来自此方法)导致了这种情况

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

k3b*_*k3b 11

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

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

NUnit 2.5有一个TimeoutAttribute,如果测试时间超过给定的毫秒,则测试失败.


Sco*_*ock 8

具有循环委托循环检查的函数到注入的依赖项:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Gis*_*shu 7

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

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

循环结构失效的概率很小.所以我通过验收测试或手动测试.

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