const performanceService = require('../services/PerformanceService'); const FileUtils = require('../utils/FileUtils'); /** * 测试生命周期管理 * 负责管理测试的全局生命周期,包括: * 1. 测试开始前的初始化工作 * 2. 测试结束后的清理和报告生成 * 3. 其他全局测试设置 */ class TestLifecycle { constructor() { this.reportPath = process.env.PERFORMANCE_REPORT_PATH || './test-results/performance-report.html'; } /** * 测试开始前的初始化 * 在所有测试开始前执行,用于准备测试环境 */ async beforeAll() { // 确保测试结果目录存在 await FileUtils.ensureDirectoryExists('./test-results'); // 清空之前的性能数据 await performanceService.clearPerformanceData(); console.log('✨ 测试环境初始化完成'); } async afterAll() { console.log('开始生成测试报告...'); try { const performanceData = performanceService.getPerformanceData(); console.log('获取到性能数据:', performanceData.length, '条记录'); const report = this.generateReport(performanceData); await this.saveReport(report); console.log(`📊 测试报告已生成: ${this.reportPath}`); } catch (error) { console.error('生成测试报告出错:', error); throw error; } } /** * 生成测试报告 * @param {Object} data 性能数据对象 * @returns {String} 测试报告字符串 */ generateReport(performanceData) { // 统计数据 const totalTests = performanceData.length; const successTests = performanceData.filter(record => record.success).length; const failedTests = totalTests - successTests; const successRate = totalTests > 0 ? ((successTests / totalTests) * 100).toFixed(2) : '0.00'; const totalDuration = performanceData.reduce((sum, record) => sum + record.duration, 0); // 按页面分组统计 const pageStats = {}; performanceData.forEach(record => { const { pageName, duration, success, errorMessage } = record; if (!pageStats[pageName]) { pageStats[pageName] = { totalTests: 0, successCount: 0, failureCount: 0, totalDuration: 0, errors: [] }; } const stats = pageStats[pageName]; stats.totalTests++; success ? stats.successCount++ : stats.failureCount++; stats.totalDuration += duration; if (!success && errorMessage) { stats.errors.push(errorMessage); } }); // 生成HTML报告 return `
执行时间: ${new Date().toLocaleString()}
${totalTests}
${successTests}
${failedTests}
${successRate}%
${(totalDuration / 1000).toFixed(2)}秒
| 页面名称 | 测试结果 | 执行时间 | 成功数/总数 | 错误信息 |
|---|---|---|---|---|
| ${record.pageName} | ${record.success ? '通过' : '失败'} | ${(record.duration / 1000).toFixed(2)}秒 | ${stats ? `${stats.successCount}/${stats.totalTests}` : '0/0'} | ${record.errorMessage || ''} |