Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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.

Ответ 4

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

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