跳至主要内容

组织测试套件

随着项目的增长,不可避免地会添加越来越多的集成测试。这会增加构建时间并降低生产力。

为了防止这种情况,您应该并行运行您的测试。WebdriverIO 已经在单个会话中并行测试每个规范(或 Cucumber 中的功能文件)。一般来说,尝试每个规范文件只测试一个功能。尝试不要在一个文件中包含太多或太少的测试。(但是,这里没有黄金法则。)

一旦您的测试有多个规范文件,您就应该开始并发运行您的测试。为此,请调整配置文件中的maxInstances属性。WebdriverIO 允许您以最大并发性运行测试,这意味着无论您有多少文件和测试,它们都可以并行运行。(这仍然受某些限制,例如您计算机的 CPU、并发限制等。)

假设您有 3 种不同的功能(Chrome、Firefox 和 Safari),并且您已将maxInstances设置为1。WDIO 测试运行器将生成 3 个进程。因此,如果您有 10 个规范文件并将maxInstances设置为10所有规范文件都将同时进行测试,并且将生成 30 个进程。

您可以全局定义maxInstances属性以设置所有浏览器的属性。

如果您运行自己的 WebDriver 网格,您可能(例如)对一个浏览器比另一个浏览器有更多的容量。在这种情况下,您可以在功能对象中限制maxInstances

// wdio.conf.js
export const config = {
// ...
// set maxInstance for all browser
maxInstances: 10,
// ...
capabilities: [{
browserName: 'firefox'
}, {
// maxInstances can get overwritten per capability. So if you have an in-house WebDriver
// grid with only 5 firefox instance available you can make sure that not more than
// 5 instance gets started at a time.
browserName: 'chrome'
}],
// ...
}

从主配置文件继承

如果您在多个环境(例如,开发和集成)中运行测试套件,使用多个配置文件来保持事物的可管理性可能会有所帮助。

类似于页面对象概念,您首先需要一个主配置文件。它包含您在所有环境之间共享的所有配置。

然后为每个环境创建另一个配置文件,并使用特定于环境的配置文件补充主配置文件

// wdio.dev.config.js
import { deepmerge } from 'deepmerge-ts'
import wdioConf from './wdio.conf.js'

// have main config file as default but overwrite environment specific information
export const config = deepmerge(wdioConf.config, {
capabilities: [
// more caps defined here
// ...
],

// run tests on sauce instead locally
user: process.env.SAUCE_USERNAME,
key: process.env.SAUCE_ACCESS_KEY,
services: ['sauce']
}, { clone: false })

// add an additional reporter
config.reporters.push('allure')

将测试规范分组到套件中

您可以将测试规范分组到套件中,并运行单个特定套件而不是所有套件。

首先,在您的 WDIO 配置中定义您的套件

// wdio.conf.js
export const config = {
// define all tests
specs: ['./test/specs/**/*.spec.js'],
// ...
// define specific suites
suites: {
login: [
'./test/specs/login.success.spec.js',
'./test/specs/login.failure.spec.js'
],
otherFeature: [
// ...
]
},
// ...
}

现在,如果您只想运行单个套件,您可以将套件名称作为 CLI 参数传递

wdio wdio.conf.js --suite login

或者,一次运行多个套件

wdio wdio.conf.js --suite login --suite otherFeature

将测试规范分组以顺序运行

如上所述,并发运行测试有很多好处。但是,在某些情况下,将测试分组以在单个实例中顺序运行会很有益。这方面的例子主要是设置成本很高的地方,例如转译代码或预配云实例,但也有一些高级用法模型可以从这种功能中受益。

要将测试分组以在单个实例中运行,请将其定义为规范定义中的数组。

    "specs": [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
],
"./test/specs/test_b*.js",
],

在上面的示例中,测试'test_login.js'、'test_product_order.js'和'test_checkout.js'将在单个实例中顺序运行,并且每个“test_b*”测试将在单独的实例中并发运行。

也可以对套件中定义的规范进行分组,因此您现在也可以这样定义套件

    "suites": {
end2end: [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
]
],
allb: ["./test/specs/test_b*.js"]
},

在这种情况下,“end2end”套件的所有测试都将在单个实例中运行。

使用模式顺序运行测试时,它将按字母顺序运行规范文件

  "suites": {
end2end: ["./test/specs/test_*.js"]
},

这将按以下顺序运行与上述模式匹配的文件

  [
"./test/specs/test_checkout.js",
"./test/specs/test_login.js",
"./test/specs/test_product_order.js"
]

运行选定的测试

在某些情况下,您可能只想执行套件的单个测试(或测试子集)。

使用--spec参数,您可以指定应运行哪个套件(Mocha、Jasmine)或功能(Cucumber)。路径相对于您的当前工作目录解析。

例如,仅运行您的登录测试

wdio wdio.conf.js --spec ./test/specs/e2e/login.js

或一次运行多个规范

wdio wdio.conf.js --spec ./test/specs/signup.js --spec ./test/specs/forgot-password.js

如果--spec值不指向特定的规范文件,则它将用于过滤在您的配置中定义的规范文件名。

要运行规范文件名中包含“dialog”一词的所有规范,您可以使用

wdio wdio.conf.js --spec dialog

请注意,每个测试文件都在单个测试运行器进程中运行。由于我们不会提前扫描文件(有关将文件名传递到wdio的信息,请参见下一节),因此您无法(例如)在规范文件的顶部使用describe.only来指示 Mocha 仅运行该套件。

此功能将帮助您实现相同目标。

提供--spec选项时,它将覆盖配置或功能级别的specs参数定义的任何模式。

排除选定的测试

如果需要,如果您需要从运行中排除特定规范文件,可以使用--exclude参数(Mocha、Jasmine)或功能(Cucumber)。

例如,要从测试运行中排除您的登录测试

wdio wdio.conf.js --exclude ./test/specs/e2e/login.js

或者,排除多个规范文件

wdio wdio.conf.js --exclude ./test/specs/signup.js --exclude ./test/specs/forgot-password.js

或者,在使用套件过滤时排除规范文件

wdio wdio.conf.js --suite login --exclude ./test/specs/e2e/login.js

如果--exclude值不指向特定的规范文件,则它将用于过滤在您的配置中定义的规范文件名。

要排除规范文件名中包含“dialog”一词的所有规范,您可以使用

wdio wdio.conf.js --exclude dialog

提供--exclude选项时,它将覆盖配置或功能级别的exclude参数定义的任何模式。

运行套件和测试规范

运行整个套件以及单个规范。

wdio wdio.conf.js --suite login --spec ./test/specs/signup.js

运行多个特定测试规范

在持续集成和其他情况下,有时需要指定要运行的多组规范。WebdriverIO 的wdio命令行实用程序接受管道输入的文件名(来自findgrep或其他)。

管道输入的文件名将覆盖配置的spec列表中指定的 glob 或文件名的列表。

grep -r -l --include "*.js" "myText" | wdio wdio.conf.js

注意:这将不会覆盖用于运行单个规范的--spec标志。

使用 MochaOpts 运行特定测试

您还可以通过将 mocha 特定参数:--mochaOpts.grep传递到 wdio CLI 来过滤要运行的特定suite|describe和/或it|test

wdio wdio.conf.js --mochaOpts.grep myText
wdio wdio.conf.js --mochaOpts.grep "Text with spaces"

注意:Mocha 将在 WDIO 测试运行器创建实例后过滤测试,因此您可能会看到多个实例被生成但实际上没有执行。

使用 MochaOpts 排除特定测试

您还可以通过将 mocha 特定参数:--mochaOpts.invert传递到 wdio CLI 来过滤要排除的特定suite|describe和/或it|test--mochaOpts.invert执行与--mochaOpts.grep相反的操作

wdio wdio.conf.js --mochaOpts.grep "string|regex" --mochaOpts.invert
wdio wdio.conf.js --spec ./test/specs/e2e/login.js --mochaOpts.grep "string|regex" --mochaOpts.invert

注意:Mocha 将在 WDIO 测试运行器创建实例后过滤测试,因此您可能会看到多个实例被生成但实际上没有执行。

失败后停止测试

使用bail选项,您可以告诉 WebdriverIO 在任何测试失败后停止测试。

这在测试套件很大时很有用,因为您已经知道您的构建将会中断,但您希望避免长时间等待完整的测试运行。

bail选项需要一个数字,该数字指定在 WebDriver 停止整个测试运行之前可以发生多少次测试失败。默认为0,这意味着它始终运行它可以找到的所有测试规范。

有关保释配置的更多信息,请参阅选项页面

运行选项层次结构

在声明要运行的规范时,存在一个特定的层次结构来定义哪个模式将优先。目前,它是这样工作的,从最高优先级到最低优先级

CLI --spec 参数 > 功能 specs 模式 > 配置 specs 模式 CLI --exclude 参数 > 配置 exclude 模式 > 功能 exclude 模式

如果只给出配置参数,它将用于所有功能。但是,如果在功能级别定义模式,则将使用它而不是配置模式。最后,命令行上定义的任何规范模式将覆盖所有其他给定的模式。

使用功能定义的规范模式

在功能级别定义规范模式时,它将覆盖在配置级别定义的任何模式。当需要根据不同的设备功能分离测试时,这很有用。在这种情况下,在配置级别使用通用规范模式,在功能级别使用更具体的模式更有用。

例如,假设您有两个目录,一个用于 Android 测试,一个用于 iOS 测试。

您的配置文件可以这样定义模式,用于非特定设备测试

{
specs: ['tests/general/**/*.js']
}

但是,您将为您的 Android 和 iOS 设备提供不同的功能,其中模式可能如下所示

{
"platformName": "Android",
"specs": [
"tests/android/**/*.js"
]
}
{
"platformName": "iOS",
"specs": [
"tests/ios/**/*.js"
]
}

如果您的配置文件需要这两种功能,则 Android 设备将只运行“android”命名空间下的测试,而 iOS 测试将只运行“ios”命名空间下的测试!

//wdio.conf.js
export const config = {
"specs": [
"tests/general/**/*.js"
],
"capabilities": [
{
platformName: "Android",
specs: ["tests/android/**/*.js"],
//...
},
{
platformName: "iOS",
specs: ["tests/ios/**/*.js"],
//...
},
{
platformName: "Chrome",
//config level specs will be used
}
]
}

欢迎!我如何帮助您?

WebdriverIO AI Copilot