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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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 dependency every time, and you can control the looping in your test, so that it only loops the number of times you want. In the production environment, instantiate it with an instance of IShouldLoop that always returns true.

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

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

Другие вопросы по тегам