跳至主要内容

使用 ESLint 服务自动检测缺失的导入

wdio-eslinter-service 是一个第三方软件包,更多信息请参见GitHub | npm

您是否曾经运行过端到端测试,却在 10、15 或 30 分钟后才发现存在缺失/拼写错误的导入,而该错误直到测试运行到中间才会出现?发生这种情况时,测试运行器会将这些测试报告为失败。

ESLint 是一个用于在运行时之前捕获不同错误的强大工具,此服务在执行 WebdriverIO 测试之前运行 ESLint 工具,作为自动步骤而不是手动步骤。

越早发现问题越好,这样我们就可以更快地解决问题,而不是等到以后。

推荐的配置是使用未解析的运行器仅检查缺失的导入,但如果需要,您还可以配置服务以使用 npm 或 yarn 运行器在您的项目中运行 ESLint,或者通过传递一个标志来指示系统也使用您的 .eslintrc 配置。

安装

安装 wdio-eslinter-service

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

快速入门 - 仅检查缺失或未解析的导入

默认情况下,此最小配置(“未解析”运行器)检查未解析的 require 导入,并在发现未解析的导入时抛出错误。然后,服务停止执行。如果需要,您可以自定义 .eslintrc.js 以使用“npm”或“yarn”运行器执行更多检查。有关更多详细信息,请参见ESLint

如果您的项目中没有 .eslintrc.js 配置,则可以配置 wdio-eslinter-service 以使用默认配置,该配置在运行测试之前仅检查缺失的导入。这非常方便,这样您就可以尽早发现导入错误,而不是等到以后。要配置此项,请将以下 ESLint 配置添加到您的 services 数组中(假设您已经在使用 chromedriver 服务;否则,请省略该部分)

wdio.conf.js

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

此时,开始运行测试,如果存在缺失或不正确的导入,WebdriverIO 将记录它并立即终止测试运行。

$ npx wdio

可选 - 如果使用模块别名

如果您使用的是module-alias 模块,该模块允许您配置别名以替换相对路径,则需要使用 eslint-import-resolver-custom-alias 插件将其传递到 ESLint 配置中。以下是一个示例。

    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 配置一起使用

要使 ESLint 服务也使用项目中的现有 eslintrc 配置,请在 wdio.conf.js 配置 services 数组中将 includeProjectEslintrc 设置为 true。

我遇到过插件冲突的问题。如果您的项目 ESLint 设置也在查找未解析的导入,则这可能无法正常工作,并且可能需要调整您的 .eslintrc.js。目前不建议这样做。

高级替代方案 - 使用 npm 和 yarn 运行器

npm 和 yarn 运行器有助于您更好地控制在项目中运行现有的 ESLint 设置。使用此配置,您可以在 package.json 的 run-scripts 部分定义要运行的其他命令。

在您的 package.json 中,将此条目添加到您的运行脚本中。

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

注意:当使用 npm 或 yarn 运行器时,需要将 eslint 添加到 package.json 中才能使服务正常工作。

如果您尚未安装和配置 ESLint,则需要在您的项目中安装和配置它,以及您正在使用的任何插件,例如 eslint-plugin-import。

$ npm i eslint eslint-plugin-import

如果您使用的是 eslint-import-resolver-custom-alias 插件将模块别名映射到其实际路径,则也需要安装它。

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

如果您的项目中还没有 eslintrc 配置文件,您还需要创建一个 .eslintrc.js 文件。以下是一个基本设置,仅用于查找未解析的导入,您可以扩展此配置以在运行测试之前验证其他代码质量检查。

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

最后,将 eslinter 服务添加到 wdio.conf.js 中的 services 数组中。

    services: ['eslinter']

运行 npm run eslint 以验证并检查错误。

如果您使用 yarn,则可以配置 runnerType 服务选项。

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

如果您已经有要重用的 linter 脚本(而不是 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.

欢迎!我怎样才能帮助您?

WebdriverIO AI Copilot