Тестовые случаи для программы, использующей системные часы - PullRequest
3 голосов
/ 01 февраля 2012

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

Я ответил после

  1. Пусть программа предоставит API для установки времени, в течение которого установленная программа должна занять это время вместо времени системы

Затем он спросил меня, как вы будете тестировать выпуск продукции?

Может ли кто-нибудь высветить этот вопрос?

Thanks.Rick

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

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

По сути, вам нужно протестировать две категории вещей. В случаях, когда программа должна работать, не так ли? (Например, если он должен терпеть обратные скачки часов в обязательном порядке, что произойдет, если произойдет скачок назад?) (Если предполагается отказаться от аутентификации, если часы находятся слишком далеко, действительно ли это так?)

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

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

Другой способ заключается в неправильной установке системных часов в тестовом жгуте.

0 голосов
/ 01 февраля 2012

Мне пришлось реализовать настоящий код C ++, который использовал системные часы для реализации тайм-аутов и должен был быть протестирован. По сути, я сделал, как вы сказали. У меня был Clock абстрактный базовый класс, и критический код использовал экземпляр этого типа вместо непосредственного использования реальных часов. В моих до-тестах использовался фиктивный TestClock производный класс, для которого я мог произвольно манипулировать временем. Это позволило мне получить хорошее тестовое покрытие компонента, который использовал часы.

Реальный код использовал производный класс PosixClock, который делегирован системным часам. Так как я это проверил? Все, что мне нужно было сделать, это продемонстрировать, что PosixClock действительно использует системные часы. Модульный тест, который читал PosixClock, спал какое-то время, пока часы явно не переместились вперед, и этого было достаточно. Кроме того, у меня было несколько интеграционных тестов, демонстрирующих работоспособность тайм-аута.

Вместе эти три вида тестовых случаев (модульные тесты с использованием часов, PosixClock модульные тесты и интеграционные тесты) продемонстрировали моему удовлетворительному результату, что код верен.

0 голосов
/ 01 февраля 2012

Не уверен, что вы имеете в виду под "Производственной проблемой", но я бы создал заглушку Clock API. Во время тестов я бы указал, что система использует этот поддельный API часов, которым я могу управлять. Во время производства система просто по умолчанию использует «обычный» Clock API. Вы можете указать, какой API использовать, используя методику Dependency Injection .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...