参数化测试

简介: 参数化测试

参数化测试
example.spec.ts
[
{ name: 'Alice', expected: 'Hello, Alice!' },
{ name: 'Bob', expected: 'Hello, Bob!' },
{ name: 'Charlie', expected: 'Hello, Charlie!' },
].forEach(({ name, expected }) => {
// You can also do it with test.describe() or with multiple tests as long the test name is unique.
test(testing with ${name}, async ({ page }) => {
await page.goto(https://example.com/greet?name=${name});
await expect(page.getByRole('heading')).toHaveText(expected);
});
});

钩子前后
大多数情况下,你应该将 beforeEach、beforeAll、afterEach 和 afterAll 钩子放在 forEach 之外,这样钩子只会执行一次:
test.beforeEach(async ({ page }) => {
// ...
});

test.afterEach(async ({ page }) => {
// ...
});

[
{ name: 'Alice', expected: 'Hello, Alice!' },
{ name: 'Bob', expected: 'Hello, Bob!' },
{ name: 'Charlie', expected: 'Hello, Charlie!' },
].forEach(({ name, expected }) => {
test(testing with ${name}, async ({ page }) => {
await page.goto(https://example.com/greet?name=${name});
await expect(page.getByRole('heading')).toHaveText(expected);
});
});
如果你希望每个测试都有钩子,你可以将它们放在 describe() 中 - 因此它们会在每次迭代/每个单独的测试中执行:

example.spec.ts
[
{ name: 'Alice', expected: 'Hello, Alice!' },
{ name: 'Bob', expected: 'Hello, Bob!' },
{ name: 'Charlie', expected: 'Hello, Charlie!' },
].forEach(({ name, expected }) => {
test.describe(() => {
test.beforeEach(async ({ page }) => {
await page.goto(https://example.com/greet?name=${name});
});
test(testing with ${expected}, async ({ page }) => {
await expect(page.getByRole('heading')).toHaveText(expected);
});
});
});
参数化项目
Playwright Test 支持同时运行多个测试项目。在下面的示例中,我们将运行两个具有不同选项的项目。

我们声明选项 person 并在配置中设置该值。第一个项目以值 Alice 运行,第二个项目以值 Bob 运行。

TypeScript
JavaScript
my-test.ts
import { test as base } from '@playwright/test';

export type TestOptions = {
person: string;
};

export const test = base.extend({
// Define an option and provide a default value.
// We can later override it in the config.
person: ['John', { option: true }],
});

我们可以在测试中使用该选项,与 fixtures 类似。

example.spec.ts
import { test } from './my-test';

test('test 1', async ({ page, person }) => {
await page.goto(/index.html);
await expect(page.locator('#node')).toContainText(person);
// ...
});
现在,我们可以使用项目在多种配置中运行测试。

TypeScript
JavaScript
playwright.config.ts
import { defineConfig } from '@playwright/test';
import type { TestOptions } from './my-test';

export default defineConfig({
projects: [
{
name: 'alice',
use: { person: 'Alice' },
},
{
name: 'bob',
use: { person: 'Bob' },
},
]
});

我们还可以在夹具中使用该选项。了解有关 fixtures 的更多信息。
my-test.ts
import { test as base } from '@playwright/test';

export type TestOptions = {
person: string;
};

export const test = base.extend({
// Define an option and provide a default value.
// We can later override it in the config.
person: ['John', { option: true }],

// Override default "page" fixture.
page: async ({ page, person }, use) => {
await page.goto('/chat');
// We use "person" parameter as a "name" for the chat room.
await page.getByLabel('User Name').fill(person);
await page.getByText('Enter chat room').click();
// Each test will get a "page" that already has the person name.
await use(page);
},
});

注意
参数化项目行为在版本 1.18 中已更改。了解更多。

传递环境变量
你可以使用环境变量从命令行配置测试。

目录
相关文章
|
Java 测试技术 程序员
|
Java 程序员 网络安全
JUnit5学习之六:参数化测试(Parameterized Tests)基础
了解JUnit5的参数化测试的基本知识
206 2
JUnit5学习之六:参数化测试(Parameterized Tests)基础
|
4月前
|
测试技术
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
49 2
|
4月前
|
JSON Java 测试技术
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
79 0
|
7月前
|
消息中间件 Kafka 网络安全
JUnit5学习之七:参数化测试(Parameterized Tests)进阶
JUnit5学习之七:参数化测试(Parameterized Tests)进阶
|
7月前
|
存储 测试技术 数据库
数据驱动测试中的参数化
数据驱动测试中的参数化
|
7月前
|
测试技术 数据库
参数化单元测试
参数化单元测试
46 0
|
7月前
|
测试技术 开发者
软件测试/测试开发/全日制|Pytest参数化神器,pytest.mark.parametrize()使用
软件测试/测试开发/全日制|Pytest参数化神器,pytest.mark.parametrize()使用
|
测试技术 Python
pytest--运行指定的测试和参数化
pytest--运行指定的测试和参数化