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

Переведенное издание. Технические идентификаторы остаются в своей первоначальной форме.

Напоминание появляется после длительного простоя. Тест ожидает весь период. Это делает эксплуатацию пакета дорогостоящей, поэтому кто-то сокращает задержку в специальной сборке. Теперь в тесте больше не применяется то же правило времени. Контролируемое время браузера предлагает другой путь, при условии, что результат назван честно.
В этом руководстве используется документация часов Playwright для проверки небольшого локального напоминания. Его визуальный эффект - это придуманный обратный отсчет, а не производственная сессия или тест производительности. Мы контролируем время на стороне браузера, чтобы реализовать выбранное поведение. Мы не утверждаем, что продвижение этих часов изменяет удаленный сервер, истекает срок действия реального токена или воссоздает все условия планирования.
Отделите настенные часы от таймера
Приложение может считывать текущую дату, планировать тайм-аут или обновлять данные через определенный интервал. Эти механизмы связаны, но тест должен знать, какой из них управляет поведением. Метка даты с надписью "завтра" и обратный вызов, который срабатывает через шестьдесят секунд, - это разные контракты.
Руководство по часам Playwright описывает API-интерфейсы управления временем, включая дату и таймеры. Его метод фиксированного времени изменяет сообщаемое время без опережения таймеров. Установка часов обеспечивает более широкую управляемую настройку. Выберите метод из фактического правила приложения, а не из того примера, который легче всего вставить.
В нашей демонстрации страница планирует напоминание через setTimeout. Установите управляемые часы до запуска временного кода страницы. Затем сознательно перемещайтесь по расписанию обратного вызова:
await page.clock.install();
await page.setContent(`
<p role="status">Waiting</p>
<script>
setTimeout(() => {
document.querySelector('[role=status]').textContent = 'Reminder ready';
}, 60000);
</script>
`);
await page.clock.runFor(60000);
await expect(page.getByRole('status')).toHaveText('Reminder ready');Фрагмент использует локальное фикстуру HTML и импортированное ожидание Playwright. Это пример механизма, а не полноценное напоминание. Тест также должен проверить, что человек может делать после появления напоминания и что происходит, когда он его отклоняет. Продвижение времени не может способствовать принятию таких решений по продукту.
Выберите, как будут вести себя пропущенные обратные вызовы
Справочник по часам отличает переход по таймеру от времени прыжка. Прочтите это различие, прежде чем заменить долгое ожидание. Система, которая обновляется раз в секунду, может вести себя по-разному, если выполняется каждый запланированный обратный вызов, а не переход, имитирующий пробуждение браузера после паузы.
Используйте runFor, если выбранный сценарий требует продолжения с помощью запланированных обратных вызовов. Рассмотрим fastForward для другого сценария, в котором имеет значение поведение при пропущенном времени, следуя документированной семантике. Не рассматривайте эти две операции как взаимозаменяемые только потому, что обе происходят в более позднее время. Название теста должно указывать, какую ситуацию он представляет.
Держите небольшой футляр для границы непосредственно перед напоминанием и еще один для момента, когда оно должно появиться. Для повторяющегося таймера добавляйте правило повторения только в том случае, если функция обещает это. Одно последнее утверждение может пропустить раннее напоминание или несколько повторяющихся уведомлений.
Время браузера не совпадает с часами сервера
Реальный сеанс может истечь в соответствии с политикой сервера. Перемещение часов браузера не меняет эту политику. Обратный отсчет пользовательского интерфейса может сказать, что истек, пока сервер все еще принимает запрос, или сервер может отклонить его до того, как пользовательский интерфейс уведомит об этом. Это разные доказательства, которые нужно проверять отдельно.
Для функции с аутентификацией установите, является ли источником истины ответ сервера, временная метка истечения срока действия или локальный таймер. Используйте утвержденные промежуточные входные данные и контролируемые удостоверения. Никогда не меняйте сеанс реального аккаунта или системные часы машины просто для того, чтобы сделать наглядную проверку времени удобной.
Часовой пояс и локаль - еще одна граница. Тест таймера не проверяет автоматически календарный крайний срок в отношении изменений летнего времени или отображаемой даты в каждом языковом стандарте. Добавьте эти случаи из реальных требований, а не расширяйте значение одного зеленого результата.
Оставьте полезный временной контракт для рецензентов
Запишите источник времени, установленный механизм, исходное состояние, предварительную операцию и ожидаемую границу. Эта короткая заметка позволяет товарищу по команде понять, почему тест не спит ни на минуту и какое поведение он все еще защищает. Если позже тест не пройден, проверьте, переместило ли приложение время на другой уровень, прежде чем увеличивать произвольное время ожидания.
AnyTest описывает агентов, изучающих приложение и создающих сквозные тесты для проверки человеком. Используйте временной контракт для проверки любого предлагаемого срока действия. В этом руководстве не утверждается функция управления часами AnyTest или интеграция бегуна. Более быстрые тесты полезны, когда ярлык сохраняет вопрос, а не когда он молча заменяет другие часы.
Общие вопросы
Истекает ли время браузера для сеанса сервера?
Нет. Часы браузера не контролируют часы удаленного сервера или его политику сеансов.
Являются ли runFor и fastForward взаимозаменяемыми?
Нет. Выберите их документированное поведение обратного вызова для конкретного сценария синхронизации.