тестирование Java: ускорить время для проверки таймаутов? - PullRequest
6 голосов
/ 13 мая 2011

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

Я бы хотел проверить это, но некоторые тайм-ауты составляют несколько минут, чтобы полностью его проверить, потребуется не менее часа !!

Есть ли способ подделать ускоренное время для таймеров? Или мне просто пропорционально уменьшить все таймауты, протестировать их и каждый раз снова увеличивать?

спасибо!

Ответы [ 6 ]

3 голосов
/ 13 мая 2011

Один из способов сделать это - создать собственный интерфейс с тонкой оболочкой для Timer.Затем вы программируете на интерфейс везде в вашем коде.После этого вы делаете две реализации интерфейса.Первая - это ожидаемая реализация, которая подключается к реальному Timer объекту, как у вас сейчас.Другой - тот, который вы можете использовать для тестирования.В этой реализации вы высмеиваете функциональность Timer, но у вас есть полный контроль над тем, как запускаются события и сколько времени они занимают.Вы можете масштабировать продолжительность в соответствии с предложением @aioobe или создать резервную очередь, которая может быстро запускать события, чтобы не тратить впустую время.

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

2 голосов
/ 13 мая 2011

Насколько мне известно, нет способа сделать глобальное масштабирование скорости таймеров Java. (Предполагая, что они основаны на методе System.currentTimeMillis, вы можете попытаться добавить свой собственный путь загрузки и переопределить эту реализацию чем-то другим, но это непростое дело (если это вообще возможно).)

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

// ...
long period = (long) (someValue / TIME_SCALING);
// ...

// ...
double frequency = someValue * TIME_SCALING;
// ...
1 голос
/ 13 мая 2011

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

Я бы предложил использовать блокировки, барьеры, семафоры и т. Д.гарантировать случившееся до отношений на все;это требует большего взаимодействия между классами, но является более пуленепробиваемым (и позволяет программе работать быстрее в тестировании с использованием только одного таймера, если он идет слишком быстро)

0 голосов
/ 13 мая 2011

Я делал что-то в том же духе, но думал о том, чтобы замедлить JVM путаясь с внутренностями Hotspot. Это не так сложно, но это может внести незначительные ошибки, если не все сделано правильно. Во всяком случае, я разместил здесь вопрос, задавая что-то в том же духе, и кому-то пришла в голову идея запустить виртуальную машину в VirtualBox и сократить время (в моем случае, чтобы получить дополнительное процессорное время). Возможно, вы могли бы ускорить время в вашем случае, сократив время процессора, но завершив тестирование раньше. Или, может быть, есть предел точности для таймера, или VirtualBox может только замедлять время .. хм.

0 голосов
/ 13 мая 2011

Я подумал о простом способе ... может быть, не очень, но все же .. Я могу сделать, как сказал aioobe (TIME_SCALING), оставить его закрытым в классе, а затем получить к нему доступ из тестов, используя отражение ... по крайней мере, таким образом это не может быть замечено или использовано другими классами ..

0 голосов
/ 13 мая 2011

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

...