Как выполнить модульное тестирование метода, который входит в бесконечный цикл для некоторого ввода? - PullRequest
22 голосов
/ 11 мая 2011

Этот вопрос только что возник у меня в голове, и я хочу задать его здесь.

Случай умышленный, я просто пишу цикл, который работает бесконечно. Как мне пройти модульное тестирование?

Я спрашиваю об этом, потому что такая ситуация может возникнуть в любом месте кода. Скажите, что мой метод делегируется нескольким другим методам, и я хочу знать

  • Как это попало в бесконечный цикл
  • Какой набор данных вызвал это
  • Вызов, какой метод (из этого метода) вызвал это

У меня нет кода, написанного для этого. Вопрос только ради знаний о том, что делать, если такая ситуация возникнет в будущем. Пожалуйста, ответьте.

Ответы [ 4 ]

11 голосов
/ 11 мая 2011

Как выполнить модульное тестирование метода, который работает в бесконечном цикле для некоторого ввода?

Вы можете проверить почти противоположное: " Как выполнить модульное тестирование метода, чтобыметод не будет работать дольше, чем Xxxx миллисекунд для некоторого ввода ".Если этот тест не пройден, возможно, вы нашли кандидата с бесконечным циклом.

NUnit 2.5 имеет TimeoutAttribute , который делает тест неудачным, если тест длится дольше указанного количества миллисекунд.

8 голосов
/ 11 мая 2011

Иметь функцию, которая зацикливает делегировать проверку цикла для вставленной зависимости:

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, и вы можете управлять циклом в своем тесте, чтобы он выполнял только те циклы, которые вам нужны. В производственной среде создайте его экземпляр с экземпляром IShouldLoop, который всегда возвращает true.

7 голосов
/ 11 мая 2011

Надеюсь, вы имеете в виду какой-то цикл обработки сообщений / обработки событий. (Большинство бесконечных циклов плохие).

Я бы гарантировал, что цикл делегируется некоторому классу, который обрабатывает ввод. Протестируйте этот класс тщательно.

Вероятность того, что конструкция цикла не сработает, минимальна. Поэтому я бы проверил это с помощью приемочного теста или вручную.

Это похоже на тестирование функции Main исполняемого файла. Хитрость также заключается в том, чтобы гарантировать, что Main делегирует тестируемый класс.

3 голосов
/ 11 мая 2011

Цель объединения - протестировать каждый самый простой модуль в вашей программе.

Самым простым модулем, как правило, является функция, выполняющая одну миссию, поэтому для объединения вашего бесконечного цикла вам нужно будет извлечь каждую отдельную миссию, которую этот цикл мог бы выполнить, в отдельной функции, которую можно вызвать один раз.После этого вы сможете вызывать эти функции, учитывая все возможные параметры, чтобы протестировать различные сценарии, которые ваша функция должна обрабатывать.Бесконечный цикл как функция не должен быть объединен, но меньшие миссии внутри него.

...