Перейти к основному содержимому

Как обновить hermione до версии 7.x

warning

Если в вашем проекте hermione младше 4-й версии, то прочтите сначала «Как обновить hermione до версии 4.x», «Как обновить hermione до версии 5.x» и «Как обновить hermione до версии 6.x».

Мы рекомендуем вам обновлять hermione поэтапно, убеждаясь на каждом этапе, что все тесты проекта корректно выполняются.

Что изменилось?

Мажорные изменения

Отказ от поддержки Node.JS < 16.x

В этом мажоре hermione перестала поддерживать версии Node.JS < 16.x.

Обработка unhandled rejection

При возникновении ошибки Unhandled rejection в мастере или воркерах hermione теперь выполняем graceful shutdown. Это означает, что все последующие тесты в очереди завершаются с ошибкой Browser request was cancelled и сама hermione завершается с exit code 1.

Данное изменение необходимо, чтобы защитить пользователей от написания некорректных тестов. Пример теста с ошибкой:

it("test", async ({ browser }) => {
await browser.url("https://yandex.ru/search/?text=aaa");
expect(browser).toHaveUrlContaining("foo-bar-baz");
});

Внимательный читатель заметит, что я забыл указать await перед вызовом expect. В этом случае тест сразу после перехода по урлу завершится успешно. И только потом вылетит ошибка с Unhandled rejection, которую hermione@6 проглатывает. А hermione@7 перехватит и экстренно завершит запуск тестов. К сожалению, определить из какого теста вылетела ошибка Unhandled rejection невозможно. Так как тест может быть написан, например, так:

it("test2", async () => {
new Promise((resolve, reject) => {
setTimeout(() => {
reject("Something goes wrong");
}, 30000);
});
});

Т.е. данный тест сразу же выполнится успешно и только через 30 секунд (с учетом того, что в очереди еще есть тесты на запуск) вылетит Unhandled rejection.

Соответственно, для поиска проблемного теста нужно будет посмотреть в лог выполнения и найти последние выполнившиеся тесты перед информацией об ошибке. Ошибка будет выглядеть примерно так:

[13:48:57 GMT+3] Unhandled Rejection in hermione:worker:10830:
Promise: {}
Reason: Something goes wrong
[13:48:57 GMT+3] Terminating on critical error: Unhandled Rejection in hermione:worker:10830:
Promise: {}
Reason: Something goes wrong

test.id и suite.id теперь свойства

id для теста и сьюта теперь является свойством, а не методом, и, соответственно, необходимо его использовать как test.id или suite.id. Вызов test.id обычно используется в конфиге hermione для определения опции screenshotsDir.

Удалена опция saveHistory из конфига

Удалена опция saveHistory из конфига. Теперь необходимо использовать saveHistoryMode с доступными значениями: all, none, onlyFailed. По умолчанию используется all, т.е. история сохраняется для всех тестов. Соответственно, можно данную опцию не выставлять явно.

Минорные изменения

  • переехали с webdriverio@7 на webdriverio@8;

  • ускорили время чтения тестов примерно в 3 раза, теперь тесты читаются один раз в мастере (раньше читались для каждого браузера отдельно);

  • поддержали возможность писать конфиг на TS. Т.е. можно создать .hermione.conf.ts и hermione его сама скомпилирует и прочитает (если пользователь имеет в своем проекте пакет ts-node);

  • добавили временных меток в логи hermione. Выглядят так:

    [13:48:09 GMT+3] ✓ suite test2 [chrome-desktop:SESSION_ID] - 875ms

Патчевые изменения

  • поддержали корректное снятие скриншотов в девайсах, имеющих дробный pixelRatio (например, google pixel). Ранее скриншоты в таких девайсах снимались некорректно;
  • отвод курсора с помощью опции resetCursor: true теперь не ругается, если левый верхний угол элемента body имеет отрицательные координаты.

Как переехать?

1. Обновить hermione до 7+ и плагины до последних версий

А именно:

Если какой-то из плагинов не используется, то устанавливать его не нужно.

2. В конфиге hermione заменить test.id() на test.id

Если test.id() не используется, то ничего делать не нужно.

3. В конфиге hermione заменить опцию saveHistory на saveHistoryMode

Если saveHistory не используется, то ничего делать не нужно.

4. Заменить использование кастомного моковского интерфейса

Если используется кастомный моковский интерфейс, то необходимо заменить его на интерфейс моки из зависимостей hermione:

- const baseBdd = require('@gemini-testing/mocha/lib/interfaces/bdd');

+ const { dependencies: hermioneDeps } = require('hermione/package');
+ const mochaModule = '@gemini-testing/mocha' in hermioneDeps ? '@gemini-testing/mocha' : 'mocha';
+ const { interfaces: { bdd: baseBdd } } = require(mochaModule);

Поддержка

Если при переезде на новую версию вы столкнетесь с проблемами, или у вас возникнут какие-либо вопросы, то приходите в github issues — и мы обязательно вам поможем!