Модульное тестирование приложения на основе таймера?

В настоящее время я пишу простое мини-приложение на основе таймера на C#, которое выполняет действие n раз каждые k секунд.
Я пытаюсь внедрить стиль разработки, основанный на тестировании, поэтому моя цель - провести модульное тестирование всех частей приложения.

Итак, мой вопрос: есть ли хороший способ модульного тестирования класса, основанного на таймере?

Проблема, на мой взгляд, в том, что существует большой риск того, что выполнение тестов займет слишком много времени, поскольку они должны ждать так и так долго, пока не произойдут желаемые действия.
Особенно, если вам нужны реалистичные данные (секунды) вместо использования минимального разрешения по времени, разрешенного фреймворком (1 мс?).
Я использую фиктивный объект для действия, чтобы зарегистрировать, сколько раз действие было вызвано, и чтобы действие практически не занимало времени.

Ответов (4)

Решение

Что я сделал, так это имитировал таймер, а также текущее системное время, чтобы мои события могли запускаться немедленно, но что касается тестируемого кода, прошедшее время составляло секунды.

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

Поскольку поведение таймера гарантированно никогда не изменится, он либо будет работать должным образом (т.е. вы правильно его настроили), либо нет; кажется, будет потрачено зря усилия включить это в свой тест, если вам на самом деле это не нужно.

Я согласен с Дэнни, поскольку с точки зрения модульного тестирования, вероятно, имеет смысл просто забыть о механизме таймера и просто убедиться, что само действие работает так, как ожидалось. Я бы также сказал, что не согласен с тем, что включение конфигурации таймера в какой-либо автоматизированный набор тестов - напрасная трата усилий. Когда дело доходит до работы с приложениями для измерения времени, существует множество крайних случаев, и очень легко создать ложное чувство безопасности, тестируя только те вещи, которые легко проверить.

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

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

У Лена Холгейта есть серия из 20 статей о тестировании кода, основанного на таймере .