Auto-erkennung fehlender Importe mit eslint Service
wdio-eslinter-service ist ein Drittanbieter-Paket, weitere Informationen finden Sie auf GitHub | npm
Haben Sie jemals Ihre E2E-Tests ausgeführt, nur um 10, 15 oder 30 Minuten später festzustellen, dass ein fehlender/falsch geschriebener Import vorlag, der erst in der Mitte des Testlaufs aufgetreten ist? Wenn dies passiert, meldet der Test-Runner diese Tests als fehlerhaft.
eslint ist ein großartiges Werkzeug, um verschiedene Fehler vor der Laufzeit zu erkennen, und dieser Service führt das eslint-Tool vor der Ausführung von WebdriverIO-Tests als automatisierten Schritt anstelle eines manuellen aus.
Es ist oft besser, schneller zu scheitern, damit wir Probleme früher und nicht später beheben können.
Die empfohlene Konfiguration ist, den "unresolved"-Runner zu verwenden, um nur fehlende Importe zu überprüfen. Falls gewünscht, können Sie den Service aber auch so konfigurieren, dass er den eslinter in Ihrem Projekt mit dem npm- oder yarn-Runner ausführt oder indem Sie ein Flag übergeben, das dem System mitteilt, auch Ihre .eslintrc-Konfiguration zu verwenden.
Installation
Installieren Sie den wdio-eslinter-service:
$ npm i wdio-eslinter-service --save-dev
Schnellstart - Nur auf fehlende oder nicht aufgelöste Importe prüfen
Standardmäßig überprüft diese minimale Konfiguration, der "unresolved"-Runner, nicht aufgelöste require-Importe und löst einen Fehler aus, wenn nicht aufgelöste Importe gefunden werden. Der Service stoppt dann die Ausführung. Sie können .eslintrc.js anpassen, um mit den "npm"- oder "yarn"-Runnern mehr Prüfungen durchzuführen, falls gewünscht. Weitere Details finden Sie unter eslint.
Wenn Sie keine .eslintrc.js
-Konfiguration in Ihrem Projekt haben, kann wdio-eslinter-service so konfiguriert werden, dass eine Standardkonfiguration verwendet wird, die vor dem Ausführen der Tests nur auf fehlende Importe prüft. Dies ist praktisch, damit Sie früher und nicht später von falschen Importen erfahren. Um dies zu konfigurieren, fügen Sie die folgende eslinter-Konfiguration zu Ihrem Services-Array hinzu (unter der Annahme, dass Sie bereits den chromedriver-Service verwenden; andernfalls lassen Sie diesen Teil weg):
wdio.conf.js:
services: ['chromedriver', [
'eslinter',
{
runnerType: 'unresolved'
}
]],
An diesem Punkt starten Sie die Ausführung der Tests, und wenn es einen fehlenden oder falschen Import gibt, wird WebdriverIO ihn protokollieren und den Testlauf sofort beenden:
$ npx wdio
Optional - falls Sie module-alias verwenden
Wenn Sie das Modul module-alias verwenden, das Ihnen die Konfiguration von Aliasen zum Ersetzen relativer Pfade ermöglicht, müssen Sie dies mit dem eslint-import-resolver-custom-alias-Plugin in die eslinter-Konfiguration einfügen. Hier ist ein Beispiel:
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",
"@": "./"
}
}
}
}
}
}
]],
Installieren Sie das Plugin in Ihrem Projekt:
$ npm i eslint-import-resolver-custom-alias
Führen Sie die Tests aus und überprüfen Sie, ob das System falsche Importe findet, die Modulaliase verwenden:
$ npx wdio
Experimentell - Verwendung zusammen mit einer vorhandenen eslintrc-Konfiguration in Ihrem Projekt
Um den eslinter-Service auch mit einer vorhandenen eslintrc-Konfiguration in Ihrem Projekt zu verwenden, setzen Sie includeProjectEslintrc
in der wdio.conf.js-Konfiguration im Services-Array auf true.
Ich habe Probleme mit widersprüchlichen Plugins erlebt. Wenn Ihr Projekt-eslint-Setup auch nach nicht aufgelösten Importen sucht, funktioniert dies möglicherweise nicht und erfordert Anpassungen an Ihrer .eslintrc.js. Dies wird derzeit nicht empfohlen.
Erweiterte Alternativen - Verwendung der npm- und yarn-Runner
Die npm- und yarn-Runner helfen Ihnen, zusätzliche Kontrolle über die Ausführung eines vorhandenen eslinter-Setups in Ihrem Projekt zu erhalten. Mit dieser Konfiguration können Sie zusätzliche Befehle definieren, die im Abschnitt run-scripts Ihrer package.json ausgeführt werden sollen:
Fügen Sie in Ihrer package.json
diesen Eintrag zu Ihren Run-Scripts hinzu:
{
"scripts": {
"eslint": "eslint ."
}
}
HINWEIS: Das Hinzufügen von eslint zur package.json ist erforderlich, damit der Service funktioniert, wenn die npm- oder yarn-Runner verwendet werden.
Wenn Sie eslint noch nicht installiert und konfiguriert haben, müssen Sie es in Ihrem Projekt installieren und konfigurieren, sowie alle Plugins, die Sie verwenden, wie z.B. eslint-plugin-import:
$ npm i eslint eslint-plugin-import
Wenn Sie das eslint-import-resolver-custom-alias-Plugin verwenden, um Modulaliase ihren realen Pfaden zuzuordnen, müssen Sie es ebenfalls installieren:
$ npm i eslint-import-resolver-custom-alias
Sie müssen auch eine .eslintrc.js
-Datei erstellen, falls Sie noch keine der eslintrc-Konfigurationsdateien in Ihrem Projekt haben. Hier ist eine grundlegende Einrichtung, um nur nach nicht aufgelösten Importen zu suchen, und Sie können diese Konfiguration erweitern, um andere Codequalitätsprüfungen vor dem Ausführen von Tests zu validieren:
// .eslintrc.js
module.exports = {
"parserOptions": {
"ecmaVersion": 2022
},
"plugins": [
"import"
],
"rules": {
"import/no-unresolved": [
2,
{
"commonjs": true,
"amd": false,
"caseSensitive": true
}
]
}
}
Fügen Sie abschließend den eslinter
-Service zum Services-Array in wdio.conf.js
hinzu:
services: ['eslinter']
Führen Sie npm run eslint
aus, um zu überprüfen und nach Fehlern zu suchen.
Wenn Sie yarn
verwenden, können Sie die runnerType
-Service-Option konfigurieren:
services: [
['eslinter', { runnerType: 'yarn' }]
]
Wenn Sie bereits ein Linter-Skript haben, das Sie wiederverwenden möchten (anstelle von eslint
), können Sie die scriptName
-Service-Option konfigurieren:
services: [
['eslinter', { scriptName: 'eslint:check' }]
]
Verwendung in WebdriverIO
Starten Sie den Test-Runner von WebdriverIO wie gewohnt. eslint überprüft den Code. Wenn Fehler gefunden werden, wird die Ausführung sofort beendet.
$ npx wdio
Beispiel:
$ 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.