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

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

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

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

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

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


person Shankar Raju    schedule 11.05.2011    source источник
comment
Является ли бесконечный цикл преднамеренным? Кроме того, проблема с остановкой Google.   -  person dlev    schedule 11.05.2011
comment
Могу ли я узнать причину от того, кто задал этот вопрос, чтобы закрыть его, зачем его закрывать?   -  person Shankar Raju    schedule 11.05.2011
comment
@dlev, да, это намеренно. Это пришло мне в голову, когда я думал о ситуации, когда это могло бы произойти.   -  person Shankar Raju    schedule 11.05.2011
comment
@Shankar: когда он должен получить результат этого метода?   -  person zerkms    schedule 11.05.2011
comment
@zerkms, я отредактировал свой вопрос. ответьте, пожалуйста   -  person Shankar Raju    schedule 11.05.2011
comment
@Shankar: ты можешь привести какой-нибудь пример?   -  person zerkms    schedule 11.05.2011


Ответы (4)


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

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

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

person k3b    schedule 11.05.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.

person Scott Whitlock    schedule 11.05.2011
comment
Мне нравится этот подход. Я думаю, что имена LoopCondition и isTrue() имеют больше смысла. - person byxor; 03.04.2017
comment
Другой вариант — пометить метод как виртуальный и переопределить его для тестирования. - person Mohsen; 19.06.2017

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

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

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

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

person Gishu    schedule 11.05.2011

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

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

person CloudyMarble    schedule 11.05.2011