自定义服务
您可以为 WDIO 测试运行器编写自己的自定义服务以满足您的特定需求。
服务是为可重用逻辑创建的附加组件,用于简化测试、管理测试套件和集成结果。服务可以访问wdio.conf.js
中可用的所有相同的钩子。
可以定义两种类型的服务:启动器服务,它仅可以访问onPrepare
、onWorkerStart
、onWorkerEnd
和onComplete
钩子,这些钩子每个测试运行仅执行一次;以及工作器服务,它可以访问所有其他钩子,并且每个工作器都会执行一次。请注意,您不能在两种类型的服务之间共享(全局)变量,因为工作器服务在不同的(工作器)进程中运行。
启动器服务可以按如下方式定义
export default class CustomLauncherService {
// If a hook returns a promise, WebdriverIO will wait until that promise is resolved to continue.
async onPrepare(config, capabilities) {
// TODO: something before all workers launch
}
onComplete(exitCode, config, capabilities) {
// TODO: something after the workers shutdown
}
// custom service methods ...
}
而工作器服务应该如下所示
export default class CustomWorkerService {
/**
* `serviceOptions` contains all options specific to the service
* e.g. if defined as follows:
*
* ```
* services: [['custom', { foo: 'bar' }]]
* ```
*
* the `serviceOptions` parameter will be: `{ foo: 'bar' }`
*/
constructor (serviceOptions, capabilities, config) {
this.options = serviceOptions
}
/**
* this browser object is passed in here for the first time
*/
async before(config, capabilities, browser) {
this.browser = browser
// TODO: something before all tests are run, e.g.:
await this.browser.setWindowSize(1024, 768)
}
after(exitCode, config, capabilities) {
// TODO: something after all tests are run
}
beforeTest(test, context) {
// TODO: something before each Mocha/Jasmine test run
}
beforeScenario(test, context) {
// TODO: something before each Cucumber scenario run
}
// other hooks or custom service methods ...
}
建议通过构造函数中传递的参数存储浏览器对象。最后,将这两种类型的 worker 暴露如下
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: Options.Testrunner
) {
// ...
}
// ...
}
服务错误处理
在服务钩子期间抛出的错误将在记录时,运行器继续执行。如果服务中的钩子对于测试运行器的设置或拆卸至关重要,则可以使用webdriverio
包中公开的SevereServiceError
来停止运行器。
import { SevereServiceError } from 'webdriverio'
export default class CustomServiceLauncher {
async onPrepare(config, capabilities) {
// TODO: something critical for setup before all workers launch
throw new SevereServiceError('Something went wrong.')
}
// custom service methods ...
}
从模块导入服务
现在为了使用此服务,唯一需要做的事情就是将其分配给services
属性。
修改您的wdio.conf.js
文件使其如下所示
import CustomService from './service/my.custom.service'
export const config = {
// ...
services: [
/**
* use imported service class
*/
[CustomService, {
someOption: true
}],
/**
* use absolute path to service
*/
['/path/to/service.js', {
someOption: true
}]
],
// ...
}
在 NPM 上发布服务
为了使 WebdriverIO 社区更容易使用和发现服务,请遵循以下建议
- 服务应使用此命名约定:
wdio-*-service
- 使用 NPM 关键字:
wdio-plugin
、wdio-service
main
入口应export
服务的实例- 示例服务:
@wdio/sauce-service
遵循推荐的命名模式允许按名称添加服务
// Add wdio-custom-service
export const config = {
// ...
services: ['custom'],
// ...
}
将已发布的服务添加到 WDIO CLI 和文档
我们非常感谢每个可以帮助其他人运行更好测试的新插件!如果您创建了这样的插件,请考虑将其添加到我们的 CLI 和文档中,以便更容易找到它。
请使用以下更改提交拉取请求