Servizio di Test per Estensioni VSCode
wdio-vscode-service è un pacchetto di terze parti, per maggiori informazioni consulta GitHub | npm
Testato su:
Servizio WebdriverIO per testare le estensioni VSCode.
Questo servizio WebdriverIO ti permette di testare senza problemi le tue estensioni VSCode dall'inizio alla fine nell'IDE Desktop VSCode o come estensione web. Devi solo fornire un percorso alla tua estensione e il servizio fa il resto:
- 🏗️ Installa VSCode (sia
stable
,insiders
o una versione specifica) - ⬇️ Scarica Chromedriver specifico per una determinata versione di VSCode
- 🚀 Ti permette di accedere all'API VSCode dai tuoi test
- 🖥️ Avvia VSCode con impostazioni utente personalizzate (incluso il supporto per VSCode su Ubuntu, MacOS e Windows)
- 🌐 Oppure serve VSCode da un server per essere accessibile da qualsiasi browser per testare estensioni web
- 📔 Avvia page object con localizzatori corrispondenti alla tua versione di VSCode
Questo progetto è stato fortemente ispirato dal progetto vscode-extension-tester basato su Selenium. Questo pacchetto prende l'idea e la adatta a WebdriverIO.
A partire da VSCode v1.86 è necessario utilizzare webdriverio
v8.14 o successivo per installare Chromedriver senza configurazione necessaria. Se hai bisogno di testare versioni precedenti di VSCode, consulta la sezione Configurazione Chromedriver qui sotto.
Installazione
Per iniziare un nuovo progetto WebdriverIO, esegui:
npm create wdio ./
Una procedura guidata di installazione ti guiderà attraverso il processo. Assicurati di selezionare TypeScript come compilatore e di non generare page object per te dato che questo progetto include già tutti i page object necessari. Poi assicurati di selezionare vscode
all'interno della lista dei servizi:
Per maggiori informazioni su come installare WebdriverIO
, consulta la documentazione del progetto.
Configurazione di Esempio
Per utilizzare il servizio devi aggiungere vscode
alla tua lista di servizi, opzionalmente seguito da un oggetto di configurazione. Questo farà scaricare a WebdriverIO i binari VSCode specificati e la versione appropriata di Chromedriver:
// wdio.conf.ts
export const config = {
outputDir: 'trace',
// ...
capabilities: [{
browserName: 'vscode',
browserVersion: '1.86.0', // "insiders" o "stable" per l'ultima versione di VSCode
'wdio:vscodeOptions': {
extensionPath: __dirname,
userSettings: {
"editor.fontSize": 14
}
}
}],
services: ['vscode'],
/**
* Opzionalmente definisci il percorso in cui WebdriverIO memorizza tutti i binari VSCode, ad es.:
* services: [['vscode', { cachePath: __dirname }]]
*/
// ...
};
Se definisci wdio:vscodeOptions
con qualsiasi altro browserName
tranne vscode
, ad esempio chrome
, il servizio servirà l'estensione come estensione web. Se testi su Chrome non è richiesto alcun servizio driver aggiuntivo, ad esempio:
// wdio.conf.ts
export const config = {
outputDir: 'trace',
// ...
capabilities: [{
browserName: 'chrome',
'wdio:vscodeOptions': {
extensionPath: __dirname
}
}],
services: ['vscode'],
// ...
};
Nota: quando si testano estensioni web si può scegliere solo tra stable
o insiders
come browserVersion
.
Configurazione TypeScript
Nel tuo tsconfig.json
assicurati di aggiungere wdio-vscode-service
alla tua lista di tipi:
{
"compilerOptions": {
"types": [
"node",
"webdriverio/async",
"@wdio/mocha-framework",
"expect-webdriverio",
"wdio-vscode-service"
],
"target": "es2019",
"moduleResolution": "node",
"esModuleInterop": true
}
}
Utilizzo
Puoi quindi utilizzare il metodo getWorkbench
per accedere ai page object per i localizzatori corrispondenti alla versione VSCode desiderata:
describe('WDIO VSCode Service', () => {
it('should be able to load VSCode', async () => {
const workbench = await browser.getWorkbench()
expect(await workbench.getTitleBar().getTitle())
.toBe('[Extension Development Host] - README.md - wdio-vscode-service - Visual Studio Code')
})
})
Accesso alle API VSCode
Se desideri eseguire determinati automatismi tramite l'API VSCode puoi farlo eseguendo comandi remoti tramite il comando personalizzato executeWorkbench
. Questo comando ti consente di eseguire remotamente codice dal tuo test all'interno dell'ambiente VSCode e ti permette di accedere all'API VSCode. Puoi passare parametri arbitrari nella funzione che verranno quindi propagati nella funzione. L'oggetto vscode
verrà sempre passato come primo argomento seguito dai parametri della funzione esterna. Nota che non puoi accedere a variabili al di fuori dell'ambito della funzione poiché la callback viene eseguita remotamente. Ecco un esempio:
const workbench = await browser.getWorkbench()
await browser.executeWorkbench((vscode, param1, param2) => {
vscode.window.showInformationMessage(`I am an ${param1} ${param2}!`)
}, 'API', 'call')
const notifs = await workbench.getNotifications()
console.log(await notifs[0].getMessage()) // outputs: "I am an API call!"
Per la documentazione completa dei page object, consulta la documentazione. Puoi trovare vari esempi di utilizzo nella suite di test di questo progetto.
Configurazione
Attraverso la configurazione del servizio, puoi gestire la versione di VSCode e le impostazioni utente per VSCode:
Opzioni del Servizio
Le opzioni del servizio sono opzioni necessarie per configurare l'ambiente di test.
cachePath
Definisce un percorso di cache per evitare di riscaricare i bundle di VS Code. Questo è utile per CI/CD per evitare di riscaricare VSCode per ogni esecuzione di test.
Tipo: string
Default: process.cwd()
Capacità VSCode (wdio:vscodeOptions
)
Per eseguire test tramite VSCode devi definire vscode
come browserName
. Puoi specificare la versione VSCode fornendo una capacit à browserVersion
. Le opzioni personalizzate di VSCode sono quindi definite all'interno della capacità personalizzata wdio:vscodeOptions
. Le opzioni sono le seguenti:
binary
Percorso di un'installazione VSCode locale. Se l'opzione non viene fornita, il servizio scaricherà VSCode in base alla browserVersion
specificata (o stable
se non specificata).
Tipo: string
extensionPath
Definisce la directory dell'estensione che desideri testare.
Tipo: string
storagePath
Definisce una posizione personalizzata per VS Code per memorizzare tutti i suoi dati. Questa è la root per le directory interne di VS Code come (elenco parziale)
- user-data-dir: La directory dove sono memorizzate tutte le impostazioni utente (impostazioni globali), log delle estensioni ecc.
- extension-install-dir: La directory dove sono installate le estensioni VS Code.
Se non fornito, viene utilizzata una directory temporanea.
Tipo: string
userSettings
Definisce impostazioni utente personalizzate da applicare a VSCode.
Tipo: Record<string, number | string | object | boolean>
Default: {}
workspacePath
Apre VSCode per un workspace specifico. Se non fornito, VSCode si avvia senza un workspace aperto.
Tipo: string
filePath
Apre VSCode con un file specifico aperto.
Tipo: string
vscodeArgs
Argomenti di avvio aggiuntivi come oggetto, ad esempio:
vscodeArgs: { fooBar: true, 'bar-foo': '/foobar' }
verranno passati come:
--foo-bar --fooBar --bar-foo=/foobar
Tipo: Record<string, string | boolean>
Default: vedi constants.ts#L5-L14
verboseLogging
Se impostato su true, il servizio registra l'output di VSCode dall'host di estensione e dall'API della console.
Tipo: boolean
Default: false
vscodeProxyOptions
Le configurazioni del proxy dell'API VSCode definiscono come WebdriverIO si connette al workbench VSCode per darti accesso all'API VSCode.
Tipo: VSCodeProxyOptions
Default:
{
/**
* Se impostato su true, il servizio tenta di stabilire una connessione con il
* workbench VSCode per abilitare l'accesso all'API VSCode
*/
enable: true,
/**
* Porta della connessione WebSocket utilizzata per connettersi al workbench.
* Di default impostata su una porta disponibile nel tuo sistema operativo.
*/
// port?: number
/**
* Timeout per la connessione a WebSocket all'interno di VSCode
*/
connectionTimeout: 5000,
/**
* Timeout per l'esecuzione del comando all'interno di VSCode
*/
commandTimeout: 5000
}
Chromedriver
A partire da VSCode v1.86 è necessario utilizzare webdriverio
v8.14 o successivo per installare Chromedriver senza configurazione necessaria. La configurazione semplificata dell'automazione del browser gestisce tutto per te.
Per testare versioni precedenti di VS Code, trova la versione prevista di Chromedriver dai log, scarica Chromedriver e configura il percorso. Ad esempio:
[0-0] ERROR webdriver: Failed downloading chromedriver v108: Download failed: ...
capabilities: [{
browserName: 'vscode',
browserVersion: '1.80.0',
'wdio:chromedriverOptions': {
binary: path.join(cacheDir, 'chromedriver-108.0.5359.71')
Creare i Tuoi PageObject
Puoi riutilizzare i componenti utilizzati in questo servizio per i tuoi page object di revisione. Per questo, crea prima un file che definisce tutti i tuoi selettori, ad esempio:
// e.g. in /test/pageobjects/locators.ts
export const componentA = {
elem: 'form', // elemento contenitore del componente
submit: 'button[type="submit"]', // pulsante di invio
username: 'input.username', // input username
password: 'input.password' // input password
}
Ora puoi creare un page object come segue:
// e.g. in /test/pageobjects/loginForm.ts
import { PageDecorator, IPageDecorator, BasePage } from 'wdio-vscode-service'
import * as locatorMap, { componentA as componentALocators } from './locators'
export interface LoginForm extends IPageDecorator<typeof componentALocators> {}
@PageDecorator(componentALocators)
export class LoginForm extends BasePage<typeof componentALocators, typeof locatorMap> {
/**
* @private chiave localizzatore per identificare la mappa del localizzatore (vedi locators.ts)
*/
public locatorKey = 'componentA' as const
public login (username: string, password: string) {
await this.username$.setValue(username)
await this.password$.setValue(password)
await this.submit$.click()
}
}
Ora nel tuo test, puoi utilizzare il tuo page object come segue:
import { LoginForm } from '../pageobjects/loginForm'
import * as locatorMap from '../locators'
// e.g. in /test/specs/example.e2e.ts
describe('my extension', () => {
it('should login', async () => {
const loginForm = new LoginForm(locatorMap)
await loginForm.login('admin', 'test123')
// puoi anche utilizzare gli elementi del page object direttamente tramite `[selector]$`
// o `[selector]$$`, ad esempio:
await loginForm.submit$.click()
// o accedere direttamente ai localizzatori
console.log(loginForm.locators.username)
// outputs: "input.username"
})
})
Supporto TypeScript
Se utilizzi WebdriverIO con TypeScript assicurati di aggiungere wdio-vscode-service
ai tuoi types
nel tuo tsconfig.json
, ad esempio:
{
"compilerOptions": {
"moduleResolution": "node",
"types": [
"webdriverio/async",
"@wdio/mocha-framework",
"expect-webdriverio",
// aggiungi questo servizio ai tuoi tipi
"wdio-devtools-service"
],
"target": "es2019"
}
}
Supporto Proxy
Durante l'inizializzazione di questo servizio, viene scaricata una distribuzione ChromeDriver e VSCode. Puoi indirizzare queste richieste attraverso un proxy impostando la variabile di ambiente HTTPS_PROXY
o https_proxy
. Ad esempio:
HTTPS_PROXY=http://127.0.0.1:1080 npm run wdio
Riferimenti
Le seguenti estensioni VS Code utilizzano wdio-vscode-service
:
- Marquee (27k download)
- Live Server (27.8m download)
- DVC Extension for Visual Studio Code (11.2k download)
- Nx Console (1.2m download)
- inlang – i18n supercharged (3k download)
Contribuire
Prima di inviare una pull request, esegui quanto segue:
git clone git@github.com:webdriverio-community/wdio-vscode-service.git
cd wdio-vscode-service
npm install
npm run build
npm run test
(onpm run ci
)
Per Saperne di Più
Se vuoi saperne di più sul testing delle estensioni VSCode, dai un'occhiata alla presentazione di Christian Bromann all'OpenJS World 2022:
Per maggiori informazioni su WebdriverIO consulta la homepage del progetto.