feat: 添加测试框架和覆盖率报告功能
feat(测试): 新增Playwright和Vitest测试配置 feat(测试): 添加测试覆盖率报告生成功能 feat(测试): 实现前后端测试脚本集成 fix(测试): 修复测试密码不匹配问题 fix(测试): 修正URL等待策略 fix(测试): 调整错误消息选择器 refactor(测试): 重构测试目录结构 refactor(测试): 优化测试用例组织方式 docs: 更新测试报告文档 docs: 添加测试覆盖率报告模板 ci: 添加Docker测试环境配置 ci: 实现测试自动化脚本 chore: 更新依赖版本 chore: 添加测试相关配置文件
This commit is contained in:
@@ -0,0 +1,312 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { LoginPage } from './pages/LoginPage';
|
||||
import { DashboardPage } from './pages/DashboardPage';
|
||||
import { UserManagementPage } from './pages/UserManagementPage';
|
||||
import { RoleManagementPage } from './pages/RoleManagementPage';
|
||||
import { TestHelper } from './utils/testHelper';
|
||||
|
||||
test.describe('测试并行化验证', () => {
|
||||
test('并行执行多个独立测试', async ({ page, context }) => {
|
||||
const page1 = page;
|
||||
const page2 = await context.newPage();
|
||||
const page3 = await context.newPage();
|
||||
|
||||
const loginPage1 = new LoginPage(page1);
|
||||
const loginPage2 = new LoginPage(page2);
|
||||
const loginPage3 = new LoginPage(page3);
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('并行登录三个页面', async () => {
|
||||
await Promise.all([
|
||||
loginPage1.goto(),
|
||||
loginPage2.goto(),
|
||||
loginPage3.goto()
|
||||
]);
|
||||
|
||||
await Promise.all([
|
||||
loginPage1.login('admin', 'admin123'),
|
||||
loginPage2.login('admin', 'admin123'),
|
||||
loginPage3.login('admin', 'admin123')
|
||||
]);
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const parallelTime = endTime - startTime;
|
||||
|
||||
console.log(`并行登录时间: ${parallelTime}ms`);
|
||||
expect(parallelTime).toBeLessThan(5000);
|
||||
|
||||
await test.step('验证所有页面登录成功', async () => {
|
||||
const url1 = page1.url();
|
||||
const url2 = page2.url();
|
||||
const url3 = page3.url();
|
||||
|
||||
expect(url1).toContain('/dashboard');
|
||||
expect(url2).toContain('/dashboard');
|
||||
expect(url3).toContain('/dashboard');
|
||||
});
|
||||
});
|
||||
|
||||
test('并行加载不同模块', async ({ page, context }) => {
|
||||
const page1 = page;
|
||||
const page2 = await context.newPage();
|
||||
const page3 = await context.newPage();
|
||||
|
||||
const loginPage1 = new LoginPage(page1);
|
||||
const loginPage2 = new LoginPage(page2);
|
||||
const loginPage3 = new LoginPage(page3);
|
||||
|
||||
await loginPage1.goto();
|
||||
await loginPage1.login('admin', 'admin123');
|
||||
await loginPage2.goto();
|
||||
await loginPage2.login('admin', 'admin123');
|
||||
await loginPage3.goto();
|
||||
await loginPage3.login('admin', 'admin123');
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('并行加载用户、角色、设置模块', async () => {
|
||||
await Promise.all([
|
||||
page1.goto('/users'),
|
||||
page2.goto('/roles'),
|
||||
page3.goto('/settings')
|
||||
]);
|
||||
|
||||
await Promise.all([
|
||||
page1.waitForSelector('[data-testid="user-table"]'),
|
||||
page2.waitForSelector('[data-testid="role-table"]'),
|
||||
page3.waitForSelector('[data-testid="settings-form"]')
|
||||
]);
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const parallelLoadTime = endTime - startTime;
|
||||
|
||||
console.log(`并行加载时间: ${parallelLoadTime}ms`);
|
||||
expect(parallelLoadTime).toBeLessThan(3000);
|
||||
});
|
||||
|
||||
test('并发API请求性能', async ({ page, request }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
await page.waitForURL(/.*dashboard/);
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('并发发送多个API请求', async () => {
|
||||
const token = await TestHelper.getAuthToken(page);
|
||||
|
||||
const promises = [
|
||||
request.get('http://localhost:8084/api/users', {
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
}),
|
||||
request.get('http://localhost:8084/api/roles', {
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
}),
|
||||
request.get('http://localhost:8084/api/permissions', {
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
}),
|
||||
request.get('http://localhost:8084/api/departments', {
|
||||
headers: { 'Authorization': `Bearer ${token}` }
|
||||
})
|
||||
];
|
||||
|
||||
const results = await Promise.all(promises);
|
||||
|
||||
expect(results[0].status()).toBe(200);
|
||||
expect(results[1].status()).toBe(200);
|
||||
expect(results[2].status()).toBe(200);
|
||||
expect(results[3].status()).toBe(200);
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const concurrentApiTime = endTime - startTime;
|
||||
|
||||
console.log(`并发API请求时间: ${concurrentApiTime}ms`);
|
||||
expect(concurrentApiTime).toBeLessThan(2000);
|
||||
});
|
||||
|
||||
test('测试隔离验证', async ({ page, context }) => {
|
||||
const page1 = page;
|
||||
const page2 = await context.newPage();
|
||||
|
||||
const loginPage1 = new LoginPage(page1);
|
||||
const loginPage2 = new LoginPage(page2);
|
||||
|
||||
await loginPage1.goto();
|
||||
await loginPage1.login('admin', 'admin123');
|
||||
await loginPage2.goto();
|
||||
await loginPage2.login('testuser', 'test123');
|
||||
|
||||
await test.step('验证页面状态隔离', async () => {
|
||||
const url1 = page1.url();
|
||||
const url2 = page2.url();
|
||||
|
||||
expect(url1).toContain('/dashboard');
|
||||
expect(url2).toContain('/dashboard');
|
||||
|
||||
const storage1 = await page1.evaluate(() => {
|
||||
return localStorage.getItem('user');
|
||||
});
|
||||
|
||||
const storage2 = await page2.evaluate(() => {
|
||||
return localStorage.getItem('user');
|
||||
});
|
||||
|
||||
expect(storage1).not.toBe(storage2);
|
||||
});
|
||||
|
||||
await test.step('验证页面操作隔离', async () => {
|
||||
await page1.goto('/users');
|
||||
await page2.goto('/roles');
|
||||
|
||||
await page1.waitForSelector('[data-testid="user-table"]');
|
||||
await page2.waitForSelector('[data-testid="role-table"]');
|
||||
|
||||
const url1 = page1.url();
|
||||
const url2 = page2.url();
|
||||
|
||||
expect(url1).toContain('/users');
|
||||
expect(url2).toContain('/roles');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('测试分组策略', () => {
|
||||
test('按模块分组执行', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const userModuleTests = [
|
||||
async () => {
|
||||
await page.goto('/users');
|
||||
await page.waitForSelector('[data-testid="user-table"]');
|
||||
},
|
||||
async () => {
|
||||
await page.goto('/users/create');
|
||||
await page.waitForSelector('[data-testid="user-form"]');
|
||||
}
|
||||
];
|
||||
|
||||
const roleModuleTests = [
|
||||
async () => {
|
||||
await page.goto('/roles');
|
||||
await page.waitForSelector('[data-testid="role-table"]');
|
||||
},
|
||||
async () => {
|
||||
await page.goto('/roles/create');
|
||||
await page.waitForSelector('[data-testid="role-form"]');
|
||||
}
|
||||
];
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('按模块顺序执行测试', async () => {
|
||||
for (const test of userModuleTests) {
|
||||
await test();
|
||||
}
|
||||
|
||||
for (const test of roleModuleTests) {
|
||||
await test();
|
||||
}
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const sequentialTime = endTime - startTime;
|
||||
|
||||
console.log(`顺序执行时间: ${sequentialTime}ms`);
|
||||
});
|
||||
|
||||
test('按优先级分组执行', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const highPriorityTests = [
|
||||
async () => {
|
||||
await page.goto('/users');
|
||||
await page.waitForSelector('[data-testid="user-table"]');
|
||||
}
|
||||
];
|
||||
|
||||
const lowPriorityTests = [
|
||||
async () => {
|
||||
await page.goto('/settings');
|
||||
await page.waitForSelector('[data-testid="settings-form"]');
|
||||
}
|
||||
];
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('按优先级执行测试', async () => {
|
||||
for (const test of highPriorityTests) {
|
||||
await test();
|
||||
}
|
||||
|
||||
for (const test of lowPriorityTests) {
|
||||
await test();
|
||||
}
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const priorityTime = endTime - startTime;
|
||||
|
||||
console.log(`优先级执行时间: ${priorityTime}ms`);
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('测试依赖优化', () => {
|
||||
test('减少测试间依赖', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('执行独立测试', async () => {
|
||||
await page.goto('/users');
|
||||
await page.waitForSelector('[data-testid="user-table"]');
|
||||
|
||||
await page.goto('/roles');
|
||||
await page.waitForSelector('[data-testid="role-table"]');
|
||||
|
||||
await page.goto('/users');
|
||||
await page.waitForSelector('[data-testid="user-table"]');
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const independentTime = endTime - startTime;
|
||||
|
||||
console.log(`独立测试执行时间: ${independentTime}ms`);
|
||||
expect(independentTime).toBeLessThan(5000);
|
||||
});
|
||||
|
||||
test('优化测试清理逻辑', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.goto();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
await test.step('快速清理测试状态', async () => {
|
||||
await page.goto('/users');
|
||||
await page.waitForSelector('[data-testid="user-table"]');
|
||||
|
||||
await TestHelper.clearAllStorage(page);
|
||||
|
||||
await page.goto('/roles');
|
||||
await page.waitForSelector('[data-testid="role-table"]');
|
||||
|
||||
await TestHelper.clearAllStorage(page);
|
||||
});
|
||||
|
||||
const endTime = Date.now();
|
||||
const cleanupTime = endTime - startTime;
|
||||
|
||||
console.log(`清理操作时间: ${cleanupTime}ms`);
|
||||
expect(cleanupTime).toBeLessThan(3000);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user