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[] = []; 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[] = []; 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); }); });