Моделирование "более быстрого времени" в Linux

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

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

Ответ 1

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

Ответ 2

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

Вместо прямого вызова 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().

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

Ответ 3

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

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


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

Это не должно происходить как замена для надлежащего и обширного модульного тестирования.

Ответ 4

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