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

Hermione v6 → v7

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 — и мы обязательно вам поможем!