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