Files
everything-is-suitable/everything-is-suitable-admin/e2e/performance/concurrency-performance.spec.ts
T
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

203 lines
6.7 KiB
TypeScript

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);
});
});