Пользовательские сервисы
Вы можете написать свой собственный пользовательский сервис для тест-раннера WDIO, чтобы настроить его под свои потребности.
Сер висы — это дополнения, созданные для многократно используемой логики, упрощающей тесты, управления вашим набором тестов и интеграции результатов. Сервисы имеют доступ ко всем тем же хукам, доступным в wdio.conf.js
.
Существует два типа сервисов, которые можно определить: сервис запуска, который имеет доступ только к хукам onPrepare
, onWorkerStart
, onWorkerEnd
и onComplete
, выполняемым только один раз за тестовый запуск, и рабочий сервис, который имеет доступ ко всем остальным хукам и выполняется для каждого рабочего процесса. Обратите внимание, что вы не можете совместно использовать (глобальные) переменные между обоими типами сервисов, так как рабочие сервисы выполняются в другом (рабочем) процессе.
Сервис запуска можно определить следующим образом:
export default class CustomLauncherService {
// Если хук возвращает обещание, WebdriverIO будет ждать, пока это обещание не будет разрешено, чтобы продолжить.
async onPrepare(config, capabilities) {
// TODO: что-то перед запуском всех рабочих процессов
}
onComplete(exitCode, config, capabilities) {
// TODO: что-то после завершения работы рабочих процессов
}
// пользовательские методы сервиса ...
}
В то время как рабочий сервис должен выглядеть так:
export default class CustomWorkerService {
/**
* `serviceOptions` содержит все опции, специфичные для сервиса
* например, если определено следующим образом:
*
* ```
* services: [['custom', { foo: 'bar' }]]
* ```
*
* параметр `serviceOptions` будет: `{ foo: 'bar' }`
*/
constructor (serviceOptions, capabilities, config) {
this.options = serviceOptions
}
/**
* этот объект браузера передается сюда в первый раз
*/
async before(config, capabilities, browser) {
this.browser = browser
// TODO: что-то перед запуском всех тестов, например:
await this.browser.setWindowSize(1024, 768)
}
after(exitCode, config, capabilities) {
// TODO: что-то после выполнения всех тестов
}
beforeTest(test, context) {
// TODO: что-то перед каждым запуском теста Mocha/Jasmine
}
beforeScenario(test, context) {
// TODO: что-то перед каждым запуском сценария Cucumber
}
// другие хуки или пользовательские методы сервиса ...
}
Рекомендуется сохранять объект браузера через переданный параметр в конструкторе. Наконец, экспортируйте оба типа сервисов следующим образом:
import CustomLauncherService from './launcher'
import CustomWorkerService from './service'
export default CustomWorkerService
export const launcher = CustomLauncherService
Если вы используете TypeScript и хотите убедиться, что параметры методов хуков типобезопасны, вы можете определить свой класс сервиса следующим образом:
import type { Capabilities, Options, Services } from '@wdio/types'
export default class CustomWorkerService implements Services.ServiceInstance {
constructor (
private _options: MyServiceOptions,
private _capabilities: Capabilities.RemoteCapability,
private _config: WebdriverIO.Config,
) {
// ...
}
// ...
}
Обработка ошибок сервиса
Ошибка, возникшая во время хука сервиса, будет записана в журнал, в то время как раннер продолжит работу. Если хук в вашем сервисе критически важен для настройки или завершения работы тест-раннера, можно использовать SevereServiceError
, экспортируемый из пакета webdriverio
, чтобы остановить раннер.
import { SevereServiceError } from 'webdriverio'
export default class CustomServiceLauncher {
async onPrepare(config, capabilities) {
// TODO: что-то критически важное для настройки перед запуском всех рабочих процессов
throw new SevereServiceError('Что-то пошло не так.')
}
// пользовательские методы сервиса ...
}