08ea5fbe98
添加用户管理视图、API和状态管理文件
203 lines
6.7 KiB
TypeScript
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);
|
|
});
|
|
}); |