运行器
在使用测试运行器时,WebdriverIO 中的运行器会协调测试的运行方式和位置。WebdriverIO 目前支持两种不同类型的运行器:本地运行器和浏览器运行器。
本地运行器
本地运行器在工作进程中启动您的框架(例如 Mocha、Jasmine 或 Cucumber),并在您的 Node.js 环境中运行所有测试文件。每个测试文件都将在每个功能的单独工作进程中运行,从而实现最大并发性。每个工作进程使用单个浏览器实例,因此运行自己的浏览器会话,从而实现最大隔离。
鉴于每个测试都在其自己的隔离进程中运行,因此无法跨测试文件共享数据。有两种方法可以解决此问题
- 使用
@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. | 使用 Web 标准(特别是 WHATWG DOM 和 HTML 标准)的重新实现,在 Node.js 中运行您的测试 | 在实际浏览器中执行您的测试,并在用户使用的环境中运行代码 |
2. | 与组件的交互只能通过 JavaScript 模仿 | 您可以使用WebdriverIO API通过 WebDriver 协议与元素进行交互 |
3. | 画布支持需要其他依赖项,并且存在局限性 | 您可以访问真实的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',
// ...
}
运行器选项
浏览器运行器允许以下配置
preset
如果您使用上述提到的框架之一测试组件,则可以定义一个预设,确保一切开箱即用。此选项不能与viteConfig
一起使用。
类型:vue
| svelte
| solid
| react
| preact
| stencil
示例
export const {
// ...
runner: ['browser', {
preset: 'svelte'
}],
// ...
}
viteConfig
定义您自己的Vite 配置。您可以传入一个自定义对象,或者如果您在开发中使用 Vite.js,则导入现有的vite.conf.ts
文件。请注意,WebdriverIO 保留自定义 Vite 配置以设置测试工具。
类型:string
或 UserConfig
或 (env: ConfigEnv) => UserConfig | Promise<UserConfig>
示例
import viteConfig from '../vite.config.ts'
export const {
// ...
runner: ['browser', { viteConfig }],
// or just:
runner: ['browser', { viteConfig: '../vites.config.ts' }],
// or use a function if your vite config contains a lot of plugins
// which you only want to resolve when value is read
runner: ['browser', {
viteConfig: () => ({
// ...
})
}],
// ...
}
headless
如果设置为true
,则运行器将更新功能以无头方式运行测试。默认情况下,这在设置了CI
环境变量为'1'
或'true'
的 CI 环境中启用。
类型:boolean
默认值:false
,如果设置了CI
环境变量,则设置为true
rootDir
项目根目录。
类型:string
默认值:process.cwd()
coverage
WebdriverIO 通过istanbul
支持测试覆盖率报告。有关更多详细信息,请参阅覆盖率选项。
类型:object
默认值:undefined
覆盖率选项
以下选项允许配置覆盖率报告。
enabled
启用覆盖率收集。
类型:boolean
默认值:false
include
作为 glob 模式包含在覆盖范围内的文件列表。
类型:string[]
默认值:[**]
exclude
作为 glob 模式排除在覆盖范围内的文件列表。
类型:string[]
默认值
[
'coverage/**',
'dist/**',
'packages/*/test{,s}/**',
'**/*.d.ts',
'cypress/**',
'test{,s}/**',
'test{,-*}.{js,cjs,mjs,ts,tsx,jsx}',
'**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx}',
'**/*{.,-}spec.{js,cjs,mjs,ts,tsx,jsx}',
'**/__tests__/**',
'**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*',
'**/.{eslint,mocha,prettier}rc.{js,cjs,yml}',
]
extension
报告应包含的文件扩展名列表。
类型:string | string[]
默认值:['.js', '.cjs', '.mjs', '.ts', '.mts', '.cts', '.tsx', '.jsx', '.vue', '.svelte']
reportsDirectory
写入覆盖率报告的目录。
类型:string
默认值:./coverage
reporter
要使用的覆盖率报告器。有关所有报告器的详细列表,请参阅istanbul 文档。
类型:string[]
默认值:['text', 'html', 'clover', 'json-summary']
perFile
检查每个文件的阈值。有关实际阈值,请参阅lines
、functions
、branches
和statements
。
类型:boolean
默认值:false
clean
在运行测试之前清除覆盖率结果。
类型:boolean
默认值:true
lines
行的阈值。
类型: number
默认值:undefined
functions
函数阈值。
类型: number
默认值:undefined
branches
分支阈值。
类型: number
默认值:undefined
statements
语句阈值。
类型: number
默认值:undefined
限制
当使用 WebdriverIO 浏览器运行器时,需要注意线程阻塞对话框(如 alert
或 confirm
)无法原生使用。这是因为它们会阻塞网页,这意味着 WebdriverIO 无法继续与页面通信,导致执行挂起。
在这种情况下,WebdriverIO 提供了具有默认返回值的默认模拟。这确保了如果用户意外使用了同步弹出式 Web API,执行不会挂起。但是,仍然建议用户模拟这些 Web API 以获得更好的体验。在 模拟 中了解更多信息。