组织测试套件
随着项目的增长,集成测试不可避免地会越来越多。这会增加构建时间并降低生产效率。
为了防止这种情况,你应该并行运行测试。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定义中将它们定义为数组。
"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
参数定义的任何模式。