export interface TestOverview { total: number; passed: number; failed: number; skipped: number; duration: number; } export interface DeviceTestResult { device: string; passed: number; failed: number; duration: number; } export class MobileTestReporter { generateOverview(results: any): TestOverview { const total = results.suites.reduce((sum: number, suite: any) => { return sum + suite.suites.reduce((suiteSum: number, subSuite: any) => { return suiteSum + subSuite.cases.length; }, 0); }, 0); const passed = results.suites.reduce((sum: number, suite: any) => { return sum + suite.suites.reduce((suiteSum: number, subSuite: any) => { return suiteSum + subSuite.cases.filter((c: any) => c.results[0]?.status === 'passed').length; }, 0); }, 0); const failed = results.suites.reduce((sum: number, suite: any) => { return sum + suite.suites.reduce((suiteSum: number, subSuite: any) => { return suiteSum + subSuite.cases.filter((c: any) => c.results[0]?.status === 'failed').length; }, 0); }, 0); return { total, passed, failed, skipped: total - passed - failed, duration: results.duration, }; } generateHtmlReport(results: any): string { const overview = this.generateOverview(results); return ` 移动端测试报告

移动端测试报告

${overview.total}
总测试数
${overview.passed}
通过
${overview.failed}
失败
${(overview.duration / 1000).toFixed(2)}s
执行时间
`; } async saveReport(report: string, outputPath: string): Promise { const fs = await import('fs/promises'); await fs.writeFile(outputPath, report, 'utf-8'); } }