Имитация "быстрее времени" в Linux - PullRequest
11 голосов
/ 08 марта 2009

У меня есть приложение на Java, работающее в Linux, в котором есть множество событий и бизнес-логика, вращающаяся вокруг времени и даты.

Для тестирования, можно ли что-то настроить во времени быстрее? Скажем, закончить целый компьютерный год за час?

Ответы [ 4 ]

9 голосов
/ 08 марта 2009

Вы можете написать интерфейс-обертку для ваших вызовов времени / даты. Имейте одну реальную реализацию, которая выполняет реальные системные вызовы, и тестовую реализацию, которая может делать все, что вы хотите (работать быстрее, медленнее, фиктивные даты и т. Д.).

7 голосов
/ 08 марта 2009

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

Вместо непосредственного вызова System.currentTimeMillis () вы можете предоставить собственную реализацию.

Примерно так (псевдокод):

class MyTime {
   private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();

   public setTimeInterface(TimeInterface timeInterface) {
      CurrentTimeInterface = timeInterface;
   }

   public int getTime() { CurrentTimeInterface.getTime(); }

}

class DefaultTimeImpl implements TimeInterface {
   public int getTime() { return System.currentTimeMillis(); }
}

class TestTimeImpl implements TimeInterface {
   private int CurrentTimeMillis = 0;
   public int getTime() { return CurrentTimeMillis; }
   public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
   public void sleep(int millis) { CurrentTimeMillis += millis; }
}

Тогда везде, где вы бы вызывали System.getTimeMillis (), вместо этого вызывайте MyTime.getTime (). Когда вы тестируете свой код, просто создайте TestTimeImpl и вызовите MyTime.setTimeInterface (testTimeImpl). Затем, когда вам нужно время для предварительного вызова, вызовите testTimeImpl.sleep () или testTimeImpl.setTime ().

Это позволяет вам моделировать любое время вплоть до миллисекунды.

2 голосов
/ 08 марта 2009

Если вы используете системные вызовы для получения системного времени (т. Е. System.currentTimeMillis()), возможно, вы можете ускорить время, изменив системное время. Это должно отражать время, которое вы видите в своем заявлении.

Если вы используете другие способы для расчета времени (истекшего времени от запуска JVM (т. Е. System.nanoTime()), серверов чистого времени и т. Д.), То ответ таков: это невозможно.


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

Это не должно заменять правильное и всестороннее модульное тестирование.

0 голосов
/ 08 марта 2009

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

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