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