配置全局设置和拆卸

简介: 配置全局设置和拆卸

有两种方法可以配置全局设置和拆卸:使用全局设置文件并将其设置在 globalSetup 下的配置中或使用 项目依赖。通过项目依赖,你可以定义一个在所有其他项目之前运行的项目。这是配置全局设置的推荐方法,因为项目依赖你的 HTML 报告将显示全局设置,跟踪查看器将记录设置的跟踪,并且可以使用夹具。

选项 1:项目依赖
项目依赖 是在另一个项目中的测试运行之前需要运行的项目列表。它们对于配置全局设置操作非常有用,以便一个项目首先依赖于此运行。使用依赖允许全局设置生成跟踪和其他工件。

设置
首先我们添加一个名为 '设置数据库' 的新项目。然后我们给它一个 testProject.testMatch 属性以匹配名为 global.setup.ts 的文件:

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global.setup.ts/,
},
// {
// other project
// }
]
});

然后,我们将 testProject.dependencies 属性添加到依赖于安装项目的项目中,并将我们在上一步中定义的依赖目的名称传递到数组中:
然后,我们将 testProject.dependencies 属性添加到依赖于安装项目的项目中,并将我们在上一步中定义的依赖目的名称传递到数组中:

playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global.setup.ts/,
},
{
name: 'chromium with db',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup db'],
},
]
});

在此示例中,'具有 db 的 chromium' 项目依赖于 '设置数据库' 项目。然后,我们创建一个设置测试,存储在项目的根级别(请注意,设置和拆卸代码必须通过调用 test() 函数定义为常规测试):

tests/global.setup.ts
import { test as setup } from '@playwright/test';

setup('create new database', async ({ }) => {
console.log('creating new database...');
// Initialize the database
});
tests/menu.spec.ts
import { test, expect } from '@playwright/test';

test('menu', async ({ page }) => {
// Your test that depends on the database
});

拆除
你可以通过向安装项目添加 testProject.teardown 属性来拆卸你的安装。这将在所有依赖目运行后运行。

首先,我们将 testProject.teardown 属性添加到我们的安装项目中,名称为 '清理数据库',这是我们在上一步中为拆卸项目指定的名称:
playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global.setup.ts/,
teardown: 'cleanup db',
},
{
name: 'cleanup db',
testMatch: /global.teardown.ts/,
},
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup db'],
},
]
});

然后我们在项目的 tests 目录中创建一个 global.teardown.ts 文件。这将用于在所有测试运行后从数据库中删除数据。

tests/global.teardown.ts
import { test as teardown } from '@playwright/test';

teardown('delete database', async ({ }) => {
console.log('deleting test database...');
// Delete the database
});
选项 2:配置 globalSetup 和 globalTeardown
你可以在运行所有测试之前使用 配置文件 中的 globalSetup 选项进行一次设置。全局设置文件必须导出一个采用配置对象的函数。该函数将在所有测试之前运行一次。

同样,在所有测试之后使用 globalTeardown 运行一次。或者,让 globalSetup 返回一个将用作全局拆卸的函数。你可以使用环境变量将端口号、身份验证令牌等数据从全局设置传递到测试。

注意
使用 globalSetup 和 globalTeardown 不会产生痕迹或伪影,配置文件中指定的选项(如 headless 或 testIdAttribute)不适用。如果你想要生成跟踪和工件并尊重配置选项,请使用 项目依赖。

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
globalSetup: require.resolve('./global-setup'),
globalTeardown: require.resolve('./global-teardown'),
});

示例
以下是一个全局设置示例,该示例仅进行一次身份验证并在测试中重用身份验证状态。它使用配置文件中的 baseURL 和 storageState 选项。

global-setup.ts
import { chromium, type FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
const { baseURL, storageState } = config.projects[0].use;
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(baseURL!);
await page.getByLabel('User Name').fill('user');
await page.getByLabel('Password').fill('password');
await page.getByText('Sign in').click();
await page.context().storageState({ path: storageState as string });
await browser.close();
}

export default globalSetup;
playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
globalSetup: require.resolve('./global-setup'),
use: {
baseURL: 'http://localhost:3000/',
storageState: 'state.json',
},
});

测试开始时已经经过身份验证,因为我们指定了由全局设置填充的 storageState。

import { test } from '@playwright/test';

test('test', async ({ page }) => {
await page.goto('/');
// You are signed in!
});
你可以通过 process.env 将任意数据设置为环境变量,从而使全局设置文件中的任意数据在测试中可用。

global-setup.ts
import type { FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
process.env.FOO = 'some data';
// Or a more complicated data structure as JSON:
process.env.BAR = JSON.stringify({ some: 'data' });
}

export default globalSetup;

测试可以访问全局设置中设置的 process.env 属性。

import { test } from '@playwright/test';

test('test', async ({ page }) => {
// environment variables which are set in globalSetup are only available inside test().
const { FOO, BAR } = process.env;

// FOO and BAR properties are populated.
expect(FOO).toEqual('some data');

const complexData = JSON.parse(BAR);
expect(BAR).toEqual({ some: 'data' });
});

捕获全局设置期间的故障痕迹
在某些情况下,捕获全局设置期间遇到的故障的踪迹可能很有用。为此,你必须在设置中执行 开始追踪,并且必须确保在发生错误时执行 停止追踪,然后才会引发该错误。这可以通过将你的设置封装在 try...catch 块中来实现。下面是扩展全局设置示例以捕获跟踪的示例。

global-setup.ts
import { chromium, type FullConfig } from '@playwright/test';

async function globalSetup(config: FullConfig) {
const { baseURL, storageState } = config.projects[0].use;
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
try {
await context.tracing.start({ screenshots: true, snapshots: true });
await page.goto(baseURL!);
await page.getByLabel('User Name').fill('user');
await page.getByLabel('Password').fill('password');
await page.getByText('Sign in').click();
await context.storageState({ path: storageState as string });
await context.tracing.stop({
path: './test-results/setup-trace.zip',
});
await browser.close();
} catch (error) {
await context.tracing.stop({
path: './test-results/failed-setup-trace.zip',
});
await browser.close();
throw error;
}
}

export default globalSetup;

目录
相关文章
|
JavaScript
vue element-ui中有关表格中的数据整条显示红色/绿色等等颜色的问题
vue element-ui中有关表格中的数据整条显示红色/绿色等等颜色的问题
633 1
|
canal 关系型数据库 中间件
开源数据同步神器——canal
作为使用最广泛的数据库,如何将mysql的数据与中间件的数据进行同步,既能确保数据的一致性、及时性,也能做到代码无侵入的方式呢?如果有这样的一个需求,数据修改后,需要及时的将mysql中的数据更新到elasticsearch,我们会怎么进行实现呢?
18251 1
|
3月前
|
存储 Windows
Windows PowerShell操作:如何删除环境变量
此外,还有一些第三方工具可以用来管理环境变量,这些工具通常提供了更为用户友好的界面来添加、编辑或删除环境变量,但是使用PowerShell可以更直接地控制这些设置,并且可以很容易地集成到脚本中以自动化环境配置的管理。
412 7
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch 中的动态计算图:实现灵活的神经网络架构
【8月更文第27天】PyTorch 是一款流行的深度学习框架,它以其灵活性和易用性而闻名。与 TensorFlow 等其他框架相比,PyTorch 最大的特点之一是支持动态计算图。这意味着开发者可以在运行时定义网络结构,这为构建复杂的模型提供了极大的便利。本文将深入探讨 PyTorch 中动态计算图的工作原理,并通过一些示例代码展示如何利用这一特性来构建灵活的神经网络架构。
1099 1
|
10月前
|
机器学习/深度学习 数据采集 算法
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
1304 12
短视频到底如何推荐的?深度剖析视频算法推送原理详细且专业的解读-优雅草卓伊凡-【01】短视频算法推荐之数据收集
|
8月前
|
机器学习/深度学习 人工智能 算法
破解生成式AI认知边界:框架思维引擎如何重塑产业智能化未来
该内容深入解析了核心技术架构,涵盖思维链强化系统(DTT)、认知框架建模体系和实时纠偏算法体系。DTT通过多级问题拆解、混合精度推理及分布式验证,大幅提升复杂问题处理能力;认知框架结合知识图谱与逻辑推理,实现精准医疗诊断等应用;实时纠偏算法则通过多级验证机制保障事实与逻辑准确性。整体架构分应用层、框架层和基础层,支持高效、可信的跨领域适配。技术创新体现在混合计算加速、持续学习机制等方面,显著优于传统模型,在事实准确性、逻辑连续性及响应速度上优势明显。
312 28
|
10月前
|
人工智能 安全 数据库
MCP:跨越AI模型与现实的桥梁
本文主要围绕AI技术的进步,特别是Anthropic的Claude 3.7 Sonnet模型在逻辑推理、代码生成和复杂任务执行方面的能力提升及其应用场景。
MCP:跨越AI模型与现实的桥梁
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
291 6