feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,203 @@
|
||||
import { test, expect, Page } from '@playwright/test';
|
||||
import { LoginPage } from '../pages/login-page';
|
||||
import { testConfig } from '../core/test-config';
|
||||
import { PerformanceMetrics, PerformanceTestHelper } from '../helpers/performance-helper';
|
||||
|
||||
test.describe.configure({
|
||||
mode: 'serial',
|
||||
timeout: 180000
|
||||
});
|
||||
|
||||
test.describe('性能测试 - 并发和负载测试', () => {
|
||||
const metrics = new PerformanceMetrics();
|
||||
const helper = new PerformanceTestHelper();
|
||||
|
||||
test.afterAll(() => {
|
||||
metrics.printReport();
|
||||
});
|
||||
|
||||
test('PT-012: 并发登录测试', async ({ browser }) => {
|
||||
const concurrency = 5;
|
||||
const promises: Promise<void>[] = [];
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
for (let i = 0; i < concurrency; i++) {
|
||||
promises.push(
|
||||
(async () => {
|
||||
const context = await browser.newContext();
|
||||
const page = await context.newPage();
|
||||
|
||||
try {
|
||||
await page.goto(testConfig.getBaseURL());
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.login(`user${i}`, `password${i}`);
|
||||
|
||||
const endTime = Date.now();
|
||||
const duration = endTime - startTime;
|
||||
metrics.recordMetric(`并发登录用户${i}响应时间`, duration);
|
||||
} finally {
|
||||
await context.close();
|
||||
}
|
||||
})()
|
||||
);
|
||||
}
|
||||
|
||||
await Promise.all(promises);
|
||||
|
||||
const averageTime = metrics.getAverage('并发登录用户0响应时间');
|
||||
expect(averageTime).toBeLessThan(5000);
|
||||
});
|
||||
|
||||
test('PT-013: 并发黄历查询测试', async ({ browser }) => {
|
||||
const concurrency = 10;
|
||||
const promises: Promise<void>[] = [];
|
||||
|
||||
const startTime = Date.now();
|
||||
|
||||
for (let i = 0; i < concurrency; i++) {
|
||||
promises.push(
|
||||
(async () => {
|
||||
const context = await browser.newContext();
|
||||
const page = await context.newPage();
|
||||
|
||||
try {
|
||||
await page.goto(testConfig.getBaseURL());
|
||||
const loginPage = new LoginPage(page);
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
await page.goto(`${testConfig.getBaseURL()}/almanac`);
|
||||
await page.fill('[data-testid="date-picker"]', `2024-01-${(i % 30) + 1}`);
|
||||
await page.click('[data-testid="query-button"]');
|
||||
await page.waitForSelector('[data-testid="almanac-result"]');
|
||||
|
||||
const endTime = Date.now();
|
||||
const duration = endTime - startTime;
|
||||
metrics.recordMetric(`并发黄历查询${i}响应时间`, duration);
|
||||
} finally {
|
||||
await context.close();
|
||||
}
|
||||
})()
|
||||
);
|
||||
}
|
||||
|
||||
await Promise.all(promises);
|
||||
|
||||
const averageTime = metrics.getAverage('并发黄历查询0响应时间');
|
||||
expect(averageTime).toBeLessThan(3000);
|
||||
});
|
||||
|
||||
test('PT-014: 页面切换性能测试', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await page.goto(testConfig.getBaseURL());
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const pages = [
|
||||
'/dashboard',
|
||||
'/users',
|
||||
'/almanac',
|
||||
'/fortune',
|
||||
'/ziwei'
|
||||
];
|
||||
|
||||
for (let i = 0; i < 3; i++) {
|
||||
for (const pagePath of pages) {
|
||||
const startTime = Date.now();
|
||||
await page.goto(`${testConfig.getBaseURL()}${pagePath}`, { waitUntil: 'networkidle' });
|
||||
const endTime = Date.now();
|
||||
const duration = endTime - startTime;
|
||||
metrics.recordMetric(`页面切换-${pagePath}`, duration);
|
||||
}
|
||||
}
|
||||
|
||||
const averageDashboardTime = metrics.getAverage('页面切换-/dashboard');
|
||||
const averageUsersTime = metrics.getAverage('页面切换-/users');
|
||||
const averageAlmanacTime = metrics.getAverage('页面切换-/almanac');
|
||||
|
||||
expect(averageDashboardTime).toBeLessThan(1000);
|
||||
expect(averageUsersTime).toBeLessThan(1000);
|
||||
expect(averageAlmanacTime).toBeLessThan(1000);
|
||||
});
|
||||
|
||||
test('PT-015: 表单提交性能测试', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await page.goto(testConfig.getBaseURL());
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
await page.goto(`${testConfig.getBaseURL()}/almanac`);
|
||||
|
||||
for (let i = 0; i < 10; i++) {
|
||||
const startTime = Date.now();
|
||||
await page.fill('[data-testid="date-picker"]', `2024-01-${(i % 30) + 1}`);
|
||||
await page.click('[data-testid="query-button"]');
|
||||
await page.waitForSelector('[data-testid="almanac-result"]');
|
||||
const endTime = Date.now();
|
||||
const duration = endTime - startTime;
|
||||
metrics.recordMetric(`表单提交-${i}`, duration);
|
||||
}
|
||||
|
||||
const averageTime = metrics.getAverage('表单提交-0');
|
||||
expect(averageTime).toBeLessThan(1000);
|
||||
});
|
||||
|
||||
test('PT-016: 内存使用监控', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await page.goto(testConfig.getBaseURL());
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const memoryUsages: number[] = [];
|
||||
|
||||
for (let i = 0; i < 10; i++) {
|
||||
const metrics = await helper.measureMemoryUsage(page);
|
||||
memoryUsages.push(metrics.used);
|
||||
|
||||
await page.goto(`${testConfig.getBaseURL()}/almanac`);
|
||||
await page.fill('[data-testid="date-picker"]', `2024-01-${(i % 30) + 1}`);
|
||||
await page.click('[data-testid="query-button"]');
|
||||
await page.waitForSelector('[data-testid="almanac-result"]');
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
}
|
||||
|
||||
const maxMemory = Math.max(...memoryUsages);
|
||||
const minMemory = Math.min(...memoryUsages);
|
||||
const memoryGrowth = maxMemory - minMemory;
|
||||
|
||||
console.log(`\n内存使用统计:`);
|
||||
console.log(` 最小值: ${(minMemory / 1024 / 1024).toFixed(2)} MB`);
|
||||
console.log(` 最大值: ${(maxMemory / 1024 / 1024).toFixed(2)} MB`);
|
||||
console.log(` 增长: ${(memoryGrowth / 1024 / 1024).toFixed(2)} MB`);
|
||||
|
||||
expect(memoryGrowth).toBeLessThan(50 * 1024 * 1024);
|
||||
});
|
||||
|
||||
test('PT-017: 网络请求统计', async ({ page }) => {
|
||||
const loginPage = new LoginPage(page);
|
||||
await page.goto(testConfig.getBaseURL());
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
const requestCounts: number[] = [];
|
||||
|
||||
for (let i = 0; i < 5; i++) {
|
||||
let requestCount = 0;
|
||||
|
||||
page.on('request', () => {
|
||||
requestCount++;
|
||||
});
|
||||
|
||||
await page.goto(`${testConfig.getBaseURL()}/almanac`);
|
||||
await page.fill('[data-testid="date-picker"]', `2024-01-${(i % 30) + 1}`);
|
||||
await page.click('[data-testid="query-button"]');
|
||||
await page.waitForSelector('[data-testid="almanac-result"]');
|
||||
|
||||
requestCounts.push(requestCount);
|
||||
metrics.recordMetric(`页面请求次数-${i}`, requestCount);
|
||||
}
|
||||
|
||||
const averageRequests = metrics.getAverage('页面请求次数-0');
|
||||
console.log(`\n网络请求统计:`);
|
||||
console.log(` 平均请求次数: ${averageRequests.toFixed(0)}`);
|
||||
|
||||
expect(averageRequests).toBeLessThan(20);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user