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