Модульное тестирование приложения на основе таймера?
-
08-06-2019 - |
Вопрос
В настоящее время я пишу простое мини-приложение на основе таймера на C#, которое выполняет действие n раз каждые k секунд.
Я пытаюсь принять стиль разработки, основанный на тестировании, поэтому моя цель — провести модульное тестирование всех частей приложения.
Итак, мой вопрос:Есть ли хороший способ модульного тестирования класса, основанного на таймере?
Проблема, на мой взгляд, в том, что существует большой риск того, что выполнение тестов будет занимать некомфортно много времени, поскольку им приходится ждать столько-то времени, чтобы произошли желаемые действия.
Особенно, если вам нужны реалистичные данные (секунды) вместо использования минимального временного разрешения, разрешенного структурой (1 мс?).
Я использую макет объекта для действия, чтобы зарегистрировать количество вызовов действия и чтобы действие практически не занимало времени.
Решение
Что я сделал, так это издевался над таймером, а также над текущим системным временем, чтобы мои события могли запускаться немедленно, но что касается тестируемого кода, то прошедшее время составляло секунды.
Другие советы
Я думаю, что в этом случае я бы проверил код, который фактически выполняется при срабатывании таймера, а не всю последовательность.Что вам действительно нужно решить, так это стоит ли вам тестировать фактическое поведение приложения (например, если то, что происходит после каждого тика, резко меняется от одного тика к другому) или этого достаточно (то есть , действие каждый раз одно и то же), чтобы просто проверить свою логику.
Поскольку поведение таймера гарантированно никогда не изменится, оно либо будет работать правильно (т. е. вы правильно его настроили), либо нет;кажется, что включение этого в ваш тест будет напрасной тратой усилий, если вам это действительно не нужно.
Я согласен с Дэнни в том смысле, что с точки зрения модульного тестирования, вероятно, имеет смысл просто забыть о механизме таймера и просто проверить, что само действие работает так, как ожидалось.Я бы также сказал, что я не согласен с тем, что включение конфигурации таймера в какой-либо автоматизированный набор тестов является напрасной тратой усилий.Когда дело доходит до работы с приложениями синхронизации, существует множество крайних случаев, и очень легко создать ложное чувство безопасности, тестируя только те вещи, которые легко проверить.
Я бы порекомендовал иметь набор тестов, который запускает таймер, а также реальные действия.Запуск этого пакета, вероятно, займет некоторое время, и вы, вероятно, не будете постоянно запускать его на своем локальном компьютере.Но установка подобных вещей в ночной автоматической сборке действительно может помочь искоренить ошибки, прежде чем их станет слишком сложно найти и исправить.
Короче говоря, мой ответ на ваш вопрос: не беспокойтесь о написании нескольких тестов, выполнение которых занимает много времени.Модульно тестируйте все, что можете, и заставьте этот набор тестов выполняться быстро и часто, но обязательно дополняйте его интеграционными тестами, которые выполняются реже, но охватывают большую часть приложения и его конфигурации.