사용자 정의 서비스
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,
) {
// ...
}
// ...
}