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

Автоматическое обнаружение отсутствующих импортов с помощью сервиса eslint

wdio-eslinter-service - это сторонний пакет, для получения дополнительной информации см. GitHub | npm

Случалось ли вам запускать тесты e2e, только чтобы узнать через 10, 15 или 30 минут, что был отсутствующий/неправильно написанный импорт, который не появился до середины тестового запуска? Когда это происходит, средство запуска тестов сообщает, что эти тесты повреждены.

eslint — отличный инструмент для обнаружения различных ошибок перед выполнением, и этот сервис запускает инструмент eslint до выполнения тестов WebdriverIO, как автоматический шаг вместо ручного.

Часто лучше потерпеть неудачу быстрее, чтобы мы могли решить проблемы раньше, а не позже.

Рекомендуемая конфигурация — использовать средство запуска unresolved для проверки отсутствующих импортов, но при желании вы также можете настроить сервис для запуска eslinter в вашем проекте с помощью npm или yarn, или передав флаг, который указывает системе также использовать вашу конфигурацию .eslintrc.

Установка

Установите wdio-eslinter-service:

$ npm i wdio-eslinter-service --save-dev 

Быстрый старт - Проверка только на отсутствующие или неразрешенные импорты

По умолчанию, эта минимальная конфигурация, средство запуска "unresolved", проверяет неразрешенные импорты require и выдает ошибку, если обнаружены неразрешенные импорты. Затем сервис останавливает выполнение. Вы можете настроить .eslintrc.js для выполнения дополнительных проверок с помощью средств запуска "npm" или "yarn", если это необходимо. См. eslint для получения дополнительной информации.

Если у вас нет конфигурации .eslintrc.js в вашем проекте, то wdio-eslinter-service можно настроить на использование конфигурации по умолчанию, которая просто проверяет отсутствующие импорты перед запуском тестов. Это удобно, чтобы вы узнали о неправильных импортах раньше, а не позже. Для настройки этого добавьте следующую конфигурацию eslinter в ваш массив services (предполагая, что вы уже используете сервис chromedriver; в противном случае, опустите эту часть):

wdio.conf.js:

    services: ['chromedriver', [
'eslinter',
{
runnerType: 'unresolved'
}
]],

На этом этапе начните запускать тесты, и если есть отсутствующий или неправильный импорт, WebdriverIO зарегистрирует его и немедленно прервет запуск теста:

$ npx wdio

Опционально - если используется module-alias

Если вы используете модуль module-alias, который позволяет настраивать псевдонимы для замены относительных путей, вам нужно будет передать это в конфигурацию eslinter с помощью плагина eslint-import-resolver-custom-alias. Вот пример:

    services: ['chromedriver', [
'eslinter',
{
runnerType: 'unresolved',
eslintOverride: {
"settings": {
"import/resolver": {
"eslint-import-resolver-custom-alias": {
"alias": {
"@utils": "./utils",
"@specs": "./test-sync/specs",
"@pageobjects": "./test-sync/pageobjects",
"@": "./"
}
}
}
}
}
}
]],

Установите плагин в свой проект:

$ npm i eslint-import-resolver-custom-alias

Запустите тесты и убедитесь, что система найдет неправильные импорты, использующие псевдонимы модулей:

$ npx wdio

Экспериментально - Использование вместе с существующей конфигурацией eslintrc в вашем проекте

Чтобы сервис eslinter также использовал существующую конфигурацию eslintrc в вашем проекте, установите includeProjectEslintrc в true в массиве services конфигурации wdio.conf.js.

Я сталкивался с проблемами из-за конфликтующих плагинов. Если ваша настройка eslint в проекте также ищет неразрешенные импорты, то это может не сработать и может потребовать корректировки вашего .eslintrc.js. В настоящее время это не рекомендуется.

Расширенные альтернативы - Использование средств запуска npm и yarn

Средства запуска npm и yarn помогают получить дополнительный контроль над запуском существующей настройки eslinter в вашем проекте. С этой конфигурацией вы можете определить дополнительные команды для запуска в разделе run-scripts в вашем package.json:

Внутри вашего package.json добавьте эту запись в ваши скрипты запуска:

{
"scripts": {
"eslint": "eslint ."
}
}

ПРИМЕЧАНИЕ: Добавление eslint в package.json необходимо для функционирования сервиса при использовании средств запуска npm или yarn.

Если у вас еще не установлен и не настроен eslint, вам нужно будет установить его и настроить в вашем проекте, а также любые плагины, которые вы используете, такие как eslint-plugin-import:

$ npm i eslint eslint-plugin-import

Если вы используете плагин eslint-import-resolver-custom-alias для сопоставления псевдонимов модулей с их реальными путями, вам также нужно будет установить его:

$ npm i eslint-import-resolver-custom-alias

Вам также нужно будет создать файл .eslintrc.js, если у вас еще нет одного из файлов конфигурации eslintrc в вашем проекте. Вот базовая настройка, которая просто ищет неразрешенные импорты, и вы можете расширить эту конфигурацию для проверки качества кода перед запуском тестов:

// .eslintrc.js
module.exports = {
"parserOptions": {
"ecmaVersion": 2022
},
"plugins": [
"import"
],
"rules": {
"import/no-unresolved": [
2,
{
"commonjs": true,
"amd": false,
"caseSensitive": true
}
]
}
}

Наконец, добавьте сервис eslinter в массив services в wdio.conf.js:

    services: ['eslinter']

Запустите npm run eslint для проверки и поиска ошибок.

Если вы используете yarn, вы можете настроить опцию сервиса runnerType:

    services: [
['eslinter', { runnerType: 'yarn' }]
]

Если у вас уже есть скрипт линтера, который вы хотите использовать повторно (вместо eslint), вы можете настроить опцию сервиса scriptName:

    services: [
['eslinter', { scriptName: 'eslint:check' }]
]

Использование в WebdriverIO

Запустите тестовый запуск WebdriverIO как обычно. eslint проверит код. Если найдены ошибки, выполнение немедленно прекращается.

$ npx wdio

Пример:

$ npx wdio --spec ./test/specs/example.e2e.js 

Execution of 1 spec files started at 2021-05-15T12:04:05.388Z

2021-05-15T12:04:05.793Z WARN wdio-eslinter-service: initialize wdio-eslint-service using npm runner.
Deleted files and directories:
/Users/jem/Dev/wdio-example/allure-results

/Users/jem/Dev/wdio-example/test/specs/login.js
1:22 error Unable to resolve path to module '.../pageObjects/Auth.page' import/no-unresolved

✖ 1 problem (1 error, 0 warnings)

2021-05-15T12:04:08.581Z ERROR wdio-eslinter-service: SEVERE: Code contains eslint errors or eslint not installed.

Welcome! How can I help?

WebdriverIO AI Copilot