QA The Other WayЗабезпечення якості в епоху тестів, написаних ШІ. QA The Other Way.
Практичний QA

Переведіть час вперед, а не час виконання тесту.

Перевірте закінчення терміну дії на стороні браузера з контрольованим часом, зберігаючи час сервера та реальне очікування поза претензією.

7 хв. читанняQA The Other Way
Авторська гранична схема годинника та таймера.
Автор редакційної ілюстрації.
Ілюстративне відео до цієї статті. англійський текст на екрані; вибрати субтитри для цієї мови.

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

Перевірте закінчення терміну дії на стороні браузера з контрольованим часом, зберігаючи час сервера та реальне очікування поза претензією.
Ілюстративна локальна демонстрація з вигаданими входами, а не інтерфейсом клієнта чи постачальника.

Після тривалого періоду простою з'являється нагадування. Тест чекає весь період. Це робить набір дорогим для запуску, тому хтось зменшує затримку в спеціальній збірці. Тепер тест більше не використовує те саме правило часу. Контрольований час браузера пропонує інший шлях, за умови, що результат названий чесно.

У цьому посібнику використовується документація годинника 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?

Ні. Виберіть їх задокументовану поведінку зворотного виклику для конкретного сценарію часу.

Джерела