参数化测试
您可以简单地在测试级别上,通过简单的 for
循环参数化测试,例如:
const people = ['Alice', 'Bob']
describe('my tests', () => {
for (const name of people) {
it(`testing with ${name}`, async () => {
// ...
})
}
})
或者通过将测试提取到动态函数中,例如:
import { browser } from '@wdio/globals'
function testComponent(componentName, options) {
it(`should test my ${componentName}`, async () => {
await browser.url(`/${componentName}`)
await expect($('input')).toHaveValue(options.expectedValue)
})
}
describe('page components', () => {
testComponent('component-a', { expectedValue: 'some expected value' })
testComponent('component-b', { expectedValue: 'some other expected value' })
})
传递环境变量
您可以使用环境变量从命令行配置测试。
例如,考虑以下需要用户名和密码的测试文件。通常最好不要将您的机密信息存储在源代码中,因此我们需要一种从外部传递机密信息的方法。
it(`example test`, async () => {
// ...
await $('#username').setValue(process.env.USERNAME)
await $('#password').setValue(process.env.PASSWORD)
})
您可以使用在命令行中设置的机密用户名和密码运行此测试。
- Bash
- Powershell
- 批处理
USERNAME=me PASSWORD=secret npx wdio run wdio.conf.js
$env:USERNAME=me
$env:PASSWORD=secret
npx wdio run wdio.conf.js
set USERNAME=me
set PASSWORD=secret
npx wdio run wdio.conf.js
类似地,配置文件也可以读取通过命令行传递的环境变量。
export const config = {
// ...
baseURL: process.env.STAGING === '1'
? 'http://staging.example.test/'
: 'http://example.test/',
// ...
}
现在,您可以针对暂存环境或生产环境运行测试
- Bash
- Powershell
- 批处理
STAGING=1 npx wdio run wdio.conf.js
$env:STAGING=1
npx wdio run wdio.conf.js
set STAGING=1
npx wdio run wdio.conf.js
.env
文件
为了更轻松地管理环境变量,请考虑使用 .env
文件。WebdriverIO 会自动将 .env
文件加载到您的环境中。您可以定义以下 .env
,而不是将环境变量定义为命令调用的部分。
.env
# .env file
STAGING=0
USERNAME=me
PASSWORD=secret
照常运行测试,您的环境变量应该会被获取。
npx wdio run wdio.conf.js
通过 CSV 文件创建测试
WebdriverIO 测试运行器在 Node.js 中运行,这意味着您可以直接读取文件系统中的文件,并使用您喜欢的 CSV 库对其进行解析。
例如,请参阅此 CSV 文件,在我们的示例 input.csv 中
"test_case","some_value","some_other_value"
"value 1","value 11","foobar1"
"value 2","value 22","foobar21"
"value 3","value 33","foobar321"
"value 4","value 44","foobar4321"
基于此,我们将使用 NPM 的 csv-parse 库生成一些测试
import fs from 'node:fs'
import path from 'node:path'
import { parse } from 'csv-parse/sync'
const records = parse(fs.readFileSync(path.join(__dirname, 'input.csv')), {
columns: true,
skip_empty_lines: true
})
describe('my test suite', () => {
for (const record of records) {
it(`foo: ${record.test_case}`, async () => {
console.log(record.test_case, record.some_value, record.some_other_value)
})
}
})