러너
WebdriverIO의 러너는 테스트러너를 사용할 때 테스트가 어떻게 그리고 어디서 실행되는지를 조율합니다. WebdriverIO는 현재 두 가지 유형의 러너를 지원합니다: 로컬 러너와 브라우저 러너입니다.
로컬 러너
로컬 러너는 워커 프로세스 내에서 프레임워크(예: Mocha, Jasmine 또는 Cucumber)를 초기화하고 Node.js 환경 내에서 모든 테스트 파일을 실행합니다. 모든 테스트 파일은 능력(capability)당 별도의 워커 프로세스에서 실행되어 최대 동시성을 허용합니다. 모든 워커 프로세스는 단일 브라우저 인스턴스를 사용하므로 자체 브라우저 세션을 실행하여 최대 격리를 가능하게 합니다.
모든 테스트가 자체 격리된 프로세스에서 실행되기 때문에 테스 트 파일 간에 데이터를 공유하는 것은 불가능합니다. 이를 해결하기 위한 두 가지 방법이 있습니다:
@wdio/shared-store-service
를 사용하여 모든 워커 간에 데이터 공유- 스펙 파일 그룹화(테스트 스위트 구성에서 자세히 읽기)
wdio.conf.js
에 다른 설정이 정의되지 않은 경우 로컬 러너가 WebdriverIO의 기본 러너입니다.
설치
로컬 러너를 사용하려면 다음과 같이 설치할 수 있습니다:
npm install --save-dev @wdio/local-runner
설정
로컬 러너는 WebdriverIO의 기본 러너이므로 wdio.conf.js
내에서 정의할 필요가 없습니다. 명시적으로 설정하려면 다음과 같이 정의할 수 있습니다:
// wdio.conf.js
export const {
// ...
runner: 'local',
// ...
}
브라우저 러너
로컬 러너와 달리 브라우저 러너는 브라우저 내에서 프레임워크를 초기화하고 실행합니다. 이를 통해 다른 많은 테스트 프레임워크처럼 JSDOM이 아닌 실제 브라우저에서 유닛 테스트나 컴포넌트 테스트를 실행할 수 있습니다.
JSDOM은 테스트 목적으로 널리 사용되지만, 결국 실제 브라우저가 아니며 모바일 환경도 에뮬레이션할 수 없습니다. 이 러너를 통해 WebdriverIO는 브라우저에서 쉽게 테스트를 실행하고 WebDriver 명령을 사용하여 페이지에 렌더링된 요소와 상호 작용할 수 있게 합니다.
다음은 JSDOM과 WebdriverIO 브라우저 러너에서 테스트를 실행하는 것에 대한 비교입니다.
JSDOM | WebdriverIO 브라우저 러너 | |
---|---|---|
1. | WHATWG DOM 및 HTML 표준을 재구현한 Node.js 내에서 테스트를 실행 | 실제 브라우저에서 테스트를 실행하고 사용자가 사용하는 환경에서 코드를 실행 |
2. | 컴포넌트와의 상호작용은 JavaScript를 통해서만 모방 가능 | WebdriverIO API를 사용하여 WebDriver 프로토콜을 통해 요소와 상호작용 가능 |
3. | Canvas 지원은 추가 종속성이 필요하고 제한이 있음 | 실제 Canvas API에 접근 가능 |
4. | JSDOM은 몇 가지 주의사항과 지원되지 않는 Web API가 있음 | 테스트가 실제 브라우저에서 실행되므로 모든 Web API 지원 |
5. | 크로스 브라우저 오류 감지 불가능 | 모바일 브라우저를 포함한 모든 브라우저 지원 |
6. | 요소 의사 상태를 테스트할 수 없음 | :hover 나 :active 와 같은 의사 상태 지원 |
이 러너는 Vite를 사용하여 테스트 코드를 컴파일하고 브라우저에 로드합니다. 다음과 같은 컴포넌트 프레임워크에 대한 프리셋이 제공됩니다:
- React
- Preact
- Vue.js
- Svelte
- SolidJS
- Stencil
모든 테스트 파일/테스트 파일 그룹은 단일 페이지 내에서 실행되며, 이는 각 테스트 사이에 페이지가 다시 로드되어 테스트 간 격리를 보장함을 의미합니다.
설치
브라우저 러너를 사용하려면 다음과 같이 설치할 수 있습니다:
npm install --save-dev @wdio/browser-runner
설정
브라우저 러너를 사용하려면 wdio.conf.js
파일에 runner
속성을 정의해야 합니다. 예를 들면:
// wdio.conf.js
export const {
// ...
runner: 'browser',
// ...
}