Каковы некоторые стратегии модульного тестирования планировщика?

StackOverflow https://stackoverflow.com/questions/931650

Вопрос

Этот пост начинался как "Каковы некоторые распространенные шаблоны в модульном тестировании многопоточного кода?", но я нашел некоторые Другое Обсуждения на ТАК, что в целом согласились, что "Это сложно (TM)" и "Это зависит (TM)".Поэтому я подумал, что сокращение объема вопроса было бы более полезным.

Предыстория :Мы внедряем простой планировщик, который дает вам возможность регистрировать обратные вызовы при запуске и остановке заданий и, конечно, настраивать частоту планирования.В настоящее время мы создаем облегченную оболочку вокруг java.util.Timer.

Аспекты:

  • Я не нашел способа протестировать этот планировщик, полагаясь только на общедоступные интерфейсы (что-то вроде addJob(jobSchedule, jobArgs,jobListener) , removeJob(jobId)).

  • Как мне засечь тот факт , что задание было вызвано в соответствии с указанным расписанием ?

Это было полезно?

Решение

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

  1. создать объект записи
  2. настройка расписания
  3. выполните модульный тест
  4. убедитесь, что объект recorder "совместим" с расписанием

Другие советы

Также следует помнить одну вещь: вам не нужно проверять, работает ли Таймер.Вы можете написать пробную версию Timer (расширив класс или используя Легкий доступ), который просто проверяет, что вы вызываете его правильно, возможно, даже заменяя настолько, что вам вообще не нужны потоки.В этом случае это может потребовать больше работы, чем необходимо, если у вашего прослушивателя заданий достаточно обратных вызовов для отслеживания планировщика.

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

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

Для тестирования параллельного программного обеспечения на Java в целом я рекомендую эту презентацию из JavaOne 2007: Тестирование Параллельного программного обеспечения.

Чтобы проверить, что планировщик должен выполнять задания в точном соответствии с их расписанием, я бы создал абстракцию самого времени.Я сделал нечто подобное в одном из своих проектов, где у меня есть интерфейс Time или Clock.Реализацией по умолчанию будет время в миллисекунду, но во время тестирования я отключу его с помощью TickTime.Эта реализация позволит моему модульному тестированию контролировать, когда время увеличивается и на сколько.

Таким образом, вы могли бы написать тест, в котором задание планируется запускать раз в 10 тактов.Затем ваш тест просто продвигает счетчик тиков и проверяет, выполняются ли задания с правильными тактами.

Несколько способов тестирования параллельного кода.

  • запускайте один и тот же код много раз под нагрузкой, некоторые ошибки появляются лишь изредка, но могут проявляться постоянно, если выполнять их повторно.
  • Храните результаты различных потоков / заданий в коллекции, такой как BlockingQueue.Это позволит вам проверить результаты в текущем потоке и завершить работу своевременно (без уродливых произвольных инструкций sleep).

Если вы затрудняетесь с тестированием параллелизма, подумайте о рефакторинге ваших объектов / компонентов, чтобы упростить их тестирование.

Если планировщик делегирует Executor или ExecutorService для выполнения задач вы могли бы использовать внедрение зависимостей, чтобы удалить прямую зависимость от типа Executor, и используйте простой однопоточный Executor чтобы протестировать большую часть функциональности вашего планировщика без сложность по-настоящему многопоточного кода.После того, как вы отладили эти тесты, вы могли бы перейти к более сложной, но теперь существенно уменьшенной по масштабам задаче тестирования потокобезопасности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top