feat: 创建测试固件和数据管理
新增文件: - e2e/fixtures/test-data.ts - 测试数据固件 - e2e/fixtures/auth.ts - 认证固件 - e2e/fixtures/storage-state.ts - 存储状态固件 - e2e/fixtures/index.ts - 导出索引文件 功能特性: - 提供标准化的测试数据(新闻、产品、服务、案例) - 支持环境变量配置管理员账号 - 封装认证流程,简化测试编写 - 支持存储状态复用,提升测试效率 - 提供XSS等安全测试数据 技术说明: - 添加 ESLint 禁用注释,因为 Playwright fixture 的 use 函数不是 React Hook
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
/* eslint-disable react-hooks/rules-of-hooks */
|
||||
import { test as base } from '@playwright/test';
|
||||
import { AdminLoginPage } from '../pages/AdminLoginPage';
|
||||
import { testFixtures } from './test-data';
|
||||
|
||||
type AuthFixtures = {
|
||||
authenticatedPage: void;
|
||||
adminLoginPage: AdminLoginPage;
|
||||
};
|
||||
|
||||
export const test = base.extend<AuthFixtures>({
|
||||
authenticatedPage: async ({ page }, use) => {
|
||||
const loginPage = new AdminLoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login(testFixtures.adminUser.email, testFixtures.adminUser.password);
|
||||
await loginPage.expectLoginSuccess();
|
||||
|
||||
await use();
|
||||
},
|
||||
|
||||
adminLoginPage: async ({ page }, use) => {
|
||||
await use(new AdminLoginPage(page));
|
||||
},
|
||||
});
|
||||
|
||||
export { expect } from '@playwright/test';
|
||||
@@ -0,0 +1,3 @@
|
||||
export { testFixtures } from './test-data';
|
||||
export { test as authTest, expect } from './auth';
|
||||
export { test as storageStateTest } from './storage-state';
|
||||
@@ -0,0 +1,29 @@
|
||||
/* eslint-disable react-hooks/rules-of-hooks */
|
||||
import { test as base } from '@playwright/test';
|
||||
import path from 'path';
|
||||
|
||||
const AUTH_FILE = path.join(__dirname, '../.auth/admin.json');
|
||||
|
||||
type StorageStateFixtures = {
|
||||
adminStorageState: string;
|
||||
};
|
||||
|
||||
export const test = base.extend<StorageStateFixtures>({
|
||||
adminStorageState: async ({ browser }, use) => {
|
||||
const context = await browser.newContext();
|
||||
const page = await context.newPage();
|
||||
|
||||
await page.goto('/admin/login');
|
||||
await page.fill('#email', process.env.ADMIN_EMAIL || 'admin@novalon.cn');
|
||||
await page.fill('#password', process.env.ADMIN_PASSWORD || 'admin123456');
|
||||
await page.click('button[type="submit"]');
|
||||
await page.waitForURL(/\/admin(?!\/login)/);
|
||||
|
||||
await page.context().storageState({ path: AUTH_FILE });
|
||||
await context.close();
|
||||
|
||||
await use(AUTH_FILE);
|
||||
},
|
||||
});
|
||||
|
||||
export { expect } from '@playwright/test';
|
||||
@@ -0,0 +1,68 @@
|
||||
export const testFixtures = {
|
||||
adminUser: {
|
||||
email: process.env.ADMIN_EMAIL || 'admin@novalon.cn',
|
||||
password: process.env.ADMIN_PASSWORD || 'admin123456',
|
||||
},
|
||||
|
||||
testContent: {
|
||||
news: {
|
||||
type: 'news' as const,
|
||||
title: `测试新闻-${Date.now()}`,
|
||||
slug: `test-news-${Date.now()}`,
|
||||
excerpt: '这是一条测试新闻的摘要内容',
|
||||
content: '<p>这是测试新闻的正文内容</p>',
|
||||
category: '公司新闻',
|
||||
tags: ['测试', '自动化'],
|
||||
status: 'published' as const,
|
||||
},
|
||||
product: {
|
||||
type: 'product' as const,
|
||||
title: `测试产品-${Date.now()}`,
|
||||
slug: `test-product-${Date.now()}`,
|
||||
excerpt: '这是一个测试产品的描述',
|
||||
content: '<p>测试产品的详细介绍</p>',
|
||||
category: '软件产品',
|
||||
tags: ['产品', '测试'],
|
||||
status: 'published' as const,
|
||||
},
|
||||
service: {
|
||||
type: 'service' as const,
|
||||
title: `测试服务-${Date.now()}`,
|
||||
slug: `test-service-${Date.now()}`,
|
||||
excerpt: '这是一个测试服务的描述',
|
||||
content: '<p>测试服务的详细介绍</p>',
|
||||
category: '软件开发',
|
||||
tags: ['服务', '测试'],
|
||||
status: 'published' as const,
|
||||
},
|
||||
case: {
|
||||
type: 'case' as const,
|
||||
title: `测试案例-${Date.now()}`,
|
||||
slug: `test-case-${Date.now()}`,
|
||||
excerpt: '这是一个测试案例的描述',
|
||||
content: '<p>测试案例的详细介绍</p>',
|
||||
category: '企业服务',
|
||||
tags: ['案例', '测试'],
|
||||
status: 'published' as const,
|
||||
},
|
||||
},
|
||||
|
||||
invalidContent: {
|
||||
empty: {
|
||||
type: 'news' as const,
|
||||
title: '',
|
||||
slug: '',
|
||||
content: '',
|
||||
},
|
||||
xss: {
|
||||
type: 'news' as const,
|
||||
title: `XSS测试-${Date.now()}`,
|
||||
slug: `xss-test-${Date.now()}`,
|
||||
excerpt: '<script>alert("XSS")</script>测试摘要',
|
||||
content: '<p><script>alert("XSS")</script>测试内容</p>',
|
||||
category: '安全测试',
|
||||
tags: ['安全'],
|
||||
status: 'published' as const,
|
||||
},
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user