运行器
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. | 在Node.js中运行您的测试,使用Web标准的重新实现,特别是WHATWG DOM和HTML标准 | 在实际浏览器中执行您的测试,并在您的用户使用的环境中运行代码 |
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',
// ...
}
运行器选项
浏览器运行器允许以下配置:
preset
如果您使用上述提到的框架之一测试组件,可以定义一个预设,确保一切都已配置好。此选项不能与viteConfig
一起使用。
类型: vue
| svelte
| solid
| react
| preact
| stencil
示例:
export const {
// ...
runner: ['browser', {
preset: 'svelte'
}],
// ...
}
viteConfig
定义您自己的Vite配置。您可以传入自定义对象或导入现有的vite.conf.ts
文件(如果您使用Vite.js进行开发)。请注意,WebdriverIO保留自定义Vite配置以设置测试环境。
类型: string
或UserConfig
或(env: ConfigEnv) => UserConfig | Promise<UserConfig>
示例:
import viteConfig from '../vite.config.ts'
export const {
// ...
runner: ['browser', { viteConfig }],
// 或者简单地:
runner: ['browser', { viteConfig: '../vites.config.ts' }],
// 或者使用函数,如果您的vite配置包含许多插件,
// 您只想在读取值时解析它们
runner: ['browser', {
viteConfig: () => ({
// ...
})
}],
// ...
}
headless
如果设置为true
,运行器将更新功能以无头方式运行测试。默认情况下,在CI环境中启用此功能,其中CI
环境变量设置为'1'
或'true'
。
类型: 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为这些API提供默认的模拟,并返回默认值。这确保了如果用户意外使用同步弹出式Web API,执行不会挂起。但是,仍然建议用户为这些Web API进行模拟以获得更好的体验。在模拟中了解更多。