Как написать модульный тест для секундомера? - PullRequest
2 голосов
/ 21 октября 2011

У меня есть класс, который измеряет время между вызовами Start и Stop. Я создал модульный тест, который спит с использованием boost::this_thread::sleep между Start и Stop, и я проверяю, что результат близок ко времени сна.

Однако этот тест не пройден на нашем агенте сборки, но не на наших машинах разработки. Проблема заключается в следующем: как я узнаю, является ли это реальной проблемой секундомера или это «проблема» в том, что агент сборки (выполняющий некоторые другие процессы, будучи виртуальной машиной) может спать дольше, чем я сказал? *

Итак, вопрос: есть ли надежный способ написать что-то вроде: «Делать что-то, что занимает ровно x секунд?»

Большое спасибо!

Ответы [ 4 ]

7 голосов
/ 21 октября 2011

Невозможно надежно протестировать что-то подобное в системе не в реальном времени.Можно было бы обернуть API для получения системного времени, которое использует ваш секундомер, и высмеивать их в тестах.

1 голос
/ 21 октября 2011

Каково разрешение вашего секундомера?Если вам нужно быть точным с точностью до секунды, то спать в течение 3 секунд и посмотреть, будете ли вы между 2,9 и 3,1, подойдет вам.Если вам нужна секунда с точностью до мили / нано, вам следует просто использовать макеты с метками времени, как указано в первом ответе.

1 голос
/ 21 октября 2011

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

1 голос
/ 21 октября 2011

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

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