diff --git a/manage-task-new.ps1 b/manage-task-new.ps1 index ce134a4..8a6e94a 100644 --- a/manage-task-new.ps1 +++ b/manage-task-new.ps1 @@ -39,17 +39,16 @@ function Get-TaskStatus { Write-Host "Name: $taskName" Write-Host "State: $($task.State)" + # 获取更详细的任务信息 + $taskInfo = Get-ScheduledTaskInfo -TaskName $taskName -ErrorAction SilentlyContinue $trigger = $task.Triggers[0] + if ($trigger) { Write-Host "Schedule: Daily at $($trigger.StartBoundary.Split('T')[1].Substring(0,5))" - try { - if ($task.NextRunTime) { - Write-Host "Next Run: $($task.NextRunTime.ToString('yyyy-MM-dd HH:mm'))" - } else { - Write-Host "Next Run: Not yet scheduled" - } - } catch { - Write-Host "Next Run: Not available" + if ($taskInfo -and $taskInfo.NextRunTime) { + Write-Host "Next Run: $($taskInfo.NextRunTime.ToString('yyyy-MM-dd HH:mm'))" + } else { + Write-Host "Next Run: Task needs to be enabled" } } diff --git a/src/hooks/testLifecycle.js b/src/hooks/testLifecycle.js index 55ab409..78dd488 100644 --- a/src/hooks/testLifecycle.js +++ b/src/hooks/testLifecycle.js @@ -130,55 +130,30 @@ class TestLifecycle { -

页面测试详情

+

测试执行详情

- - - - + + + - ${Object.entries(pageStats).map(([pageName, stats]) => ` - - - - - - - - - `).join('')} - -
页面名称测试数成功数失败数总耗时测试结果执行时间成功数/总数 错误信息
${pageName}${stats.totalTests}${stats.successCount}${stats.failureCount}${(stats.totalDuration / 1000).toFixed(2)}秒 - ${stats.errors.length > 0 ? - `
${stats.errors.join('
')}
` : - ''} -
- -

详细测试记录

- - - - - - - - - - - ${performanceData.map(record => ` + ${performanceData.map(record => { + const stats = pageStats[record.pageName]; + return ` + - `).join('')} + `; + }).join('')}
页面名称状态耗时错误信息
${record.pageName} ${record.success ? '通过' : '失败'} ${(record.duration / 1000).toFixed(2)}秒${stats ? `${stats.successCount}/${stats.totalTests}` : '0/0'} ${record.errorMessage || ''}
diff --git a/src/scripts/runTestsAndSendReport.js b/src/scripts/runTestsAndSendReport.js index d72e17c..ca9cd10 100644 --- a/src/scripts/runTestsAndSendReport.js +++ b/src/scripts/runTestsAndSendReport.js @@ -10,94 +10,53 @@ console.log(`[Node] Starting test execution process...`); console.log(`[Node] Current environment: ${env}`); async function runTestsAndSendReport() { - let testOutput = ''; - let testSuccess = false; const startTime = new Date(); console.log(`[Node] Test started at: ${startTime.toLocaleString()}`); try { - // 根据环境设置加载对应的环境变量文件 + // 加载环境变量 const envFile = `.env.${env}`; console.log(`[Node] Loading environment file: ${envFile}`); - // 检查环境文件是否存在 if (!fs.existsSync(envFile)) { - console.error(`[Node] Error: Environment file ${envFile} not found!`); throw new Error(`Environment file ${envFile} not found`); } - console.log(`[Node] Environment file found successfully`); - + // 加载环境变量 - dotenv.config({ path: envFile }); - console.log(`[Node] Environment variables loaded successfully`); + const envConfig = dotenv.config({ path: envFile }); + if (envConfig.error) { + throw new Error(`Failed to load environment variables: ${envConfig.error.message}`); + } - // 运行测试并捕获输出 - console.log('[Node] =========================================='); + // 验证必要的环境变量 + if (!process.env.BASE_URL) { + throw new Error('BASE_URL environment variable is not set in ' + envFile); + } + + console.log(`[Node] Environment loaded: BASE_URL = ${process.env.BASE_URL}`); + + // 运行测试 console.log('[Node] Starting Playwright test execution...'); - console.log('[Node] =========================================='); - - testOutput = execSync('npx playwright test', { - encoding: 'utf8', + execSync('npx playwright test', { + stdio: 'inherit', env: { ...process.env, NODE_ENV: env - }, - stdio: 'inherit' // 这将允许实时显示测试输出 + } }); - - testSuccess = true; - console.log('[Node] =========================================='); - console.log('[Node] Test execution completed successfully'); - console.log('[Node] =========================================='); - } catch (error) { - console.log('[Node] =========================================='); - console.error('[Node] Test execution failed with error:'); - console.error(error.message); - console.log('[Node] =========================================='); - testOutput = error.output ? error.output.join('\n') : error.message; - } + console.log('[Node] Test execution completed'); - const endTime = new Date(); - const duration = (endTime - startTime) / 1000 / 60; // 转换为分钟 - console.log(`[Node] Test duration: ${duration.toFixed(2)} minutes`); - - // 读取性能报告 - console.log('[Node] Attempting to read performance report...'); - let performanceData = ''; - try { + // 读取性能报告 + console.log('[Node] Reading performance report...'); const reportPath = path.join(process.cwd(), 'test-results', 'performance-report.html'); - if (fs.existsSync(reportPath)) { - performanceData = fs.readFileSync(reportPath, 'utf8'); - console.log('[Node] Performance report read successfully'); - } else { - console.log('[Node] No performance report found'); - } - } catch (error) { - console.error('[Node] Failed to read performance report:', error.message); - } + const performanceReport = fs.readFileSync(reportPath, 'utf8'); - // 构建邮件内容 - console.log('[Node] Preparing email report...'); - const emailHtml = ` -

Playwright 自动化测试报告 (${env}环境)

-
-

测试结果: ${testSuccess ? '成功 ✅' : '失败 ❌'}

-

执行环境: ${env}

-

执行时间: ${startTime.toLocaleString()}

-

持续时间: ${duration.toFixed(2)} 分钟

-
- - ${performanceData ? '

性能报告

' + performanceData : ''} - `; - - // 发送邮件 - try { - console.log('[Node] =========================================='); + // 发送邮件 console.log('[Node] Sending test report email...'); const result = await emailService.sendMail({ to: 'dengqichen@iscmtech.com', - subject: `[${testSuccess ? '成功' : '失败'}] Playwright自动化测试报告 (${env}) - ${startTime.toLocaleDateString()}`, - html: emailHtml + subject: `[成功] Playwright自动化测试报告 (${env}) - ${startTime.toLocaleDateString()}`, + html: performanceReport }); if (result.success) { @@ -105,11 +64,30 @@ async function runTestsAndSendReport() { } else { console.error('[Node] Failed to send test report email:', result.error); } - console.log('[Node] =========================================='); + } catch (error) { - console.log('[Node] =========================================='); - console.error('[Node] Error sending email:', error.message); - console.log('[Node] =========================================='); + console.error('[Node] Error:', error.message); + + // 如果测试失败,尝试读取已生成的报告 + try { + const reportPath = path.join(process.cwd(), 'test-results', 'performance-report.html'); + if (fs.existsSync(reportPath)) { + const performanceReport = fs.readFileSync(reportPath, 'utf8'); + const result = await emailService.sendMail({ + to: 'dengqichen@iscmtech.com', + subject: `[失败] Playwright自动化测试报告 (${env}) - ${startTime.toLocaleDateString()}`, + html: performanceReport + }); + + if (result.success) { + console.log('[Node] Error report email sent successfully'); + } + } else { + console.error('[Node] No performance report found'); + } + } catch (emailError) { + console.error('[Node] Failed to send error report:', emailError.message); + } } } @@ -119,13 +97,9 @@ console.log('[Node] Starting test automation process...'); console.log('[Node] =========================================='); runTestsAndSendReport().then(() => { console.log('[Node] Process will exit in 3 seconds...'); - setTimeout(() => { - process.exit(0); - }, 3000); + setTimeout(() => process.exit(0), 3000); }).catch(error => { console.error('[Node] Fatal error:', error); console.log('[Node] Process will exit in 3 seconds...'); - setTimeout(() => { - process.exit(1); - }, 3000); + setTimeout(() => process.exit(1), 3000); }); \ No newline at end of file diff --git a/test-data/test-progress.json b/test-data/test-progress.json index 6396400..0637a08 100644 --- a/test-data/test-progress.json +++ b/test-data/test-progress.json @@ -1,4 +1 @@ -[ - 1, - 2 -] \ No newline at end of file +[] \ No newline at end of file