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

测试执行详情

${performanceData.map(record => { const stats = pageStats[record.pageName]; return ` `; }).join('')}
页面名称 测试结果 执行时间 成功数/总数 错误信息
${record.pageName} ${record.success ? '通过' : '失败'} ${(record.duration / 1000).toFixed(2)}秒 ${stats ? `${stats.successCount}/${stats.totalTests}` : '0/0'} ${record.errorMessage || ''}
`; } /** * 保存测试报告 * @param {String} report 测试报告字符串 * @returns {String} 保存后的报告路径 */ async saveReport(report) { try { await FileUtils.writeFile(this.reportPath, report); return this.reportPath; } catch (error) { console.error('保存测试报告失败:', error); throw error; } } } module.exports = new TestLifecycle();