Files
Alicho/tests/scripts/run_unit_tests.bat
2025-10-28 10:27:49 +08:00

202 lines
6.8 KiB
Batchfile

@echo off
REM ================================================================================================
REM Audio Backend - 单元测试运行脚本 (Windows)
REM ================================================================================================
REM 描述: 运行项目中的所有单元测试
REM ================================================================================================
setlocal EnableDelayedExpansion
REM 设置颜色输出
set "GREEN=[92m"
set "RED=[91m"
set "YELLOW=[93m"
set "BLUE=[94m"
set "NC=[0m"
REM 脚本所在的目录路径
set "SCRIPT_DIR=%~dp0"
REM 项目根目录
for %%i in ("%SCRIPT_DIR%\..\..\..\") do set "ROOT_DIR=%%~fi"
REM 构建目录
set "BUILD_DIR=%ROOT_DIR%\build"
REM 测试结果目录
set "TEST_RESULTS_DIR=%ROOT_DIR%\test-results"
REM 单元测试结果目录
set "UNIT_TEST_RESULTS_DIR=%TEST_RESULTS_DIR%\unit"
REM 测试可执行文件目录
set "TEST_BIN_DIR=%BUILD_DIR%\bin\tests"
REM 打印脚本信息
echo %BLUE%=========================================================%NC%
echo %BLUE% 音频后端单元测试运行脚本 %NC%
echo %BLUE%=========================================================%NC%
echo %YELLOW%项目根目录: %ROOT_DIR%%NC%
echo %YELLOW%测试结果目录: %UNIT_TEST_RESULTS_DIR%%NC%
echo.
REM 确保测试结果目录存在
if not exist "%UNIT_TEST_RESULTS_DIR%" mkdir "%UNIT_TEST_RESULTS_DIR%"
REM 检查测试目录是否存在
if not exist "%TEST_BIN_DIR%" (
echo %RED%错误: 测试可执行文件目录不存在。请先构建项目。%NC%
exit /b 1
)
REM 收集所有单元测试可执行文件
set "UNIT_TEST_COUNT=0"
set "UNIT_TESTS="
for /d %%d in ("%TEST_BIN_DIR%\unit\*") do (
for %%f in ("%%d\*.exe") do (
if exist "%%f" (
set /a UNIT_TEST_COUNT+=1
set "UNIT_TESTS=!UNIT_TESTS! %%f"
)
)
)
REM 如果没有找到单元测试,显示警告并退出
if %UNIT_TEST_COUNT% equ 0 (
echo %YELLOW%警告: 未找到单元测试可执行文件。%NC%
exit /b 0
)
echo %BLUE%找到 %UNIT_TEST_COUNT% 个单元测试%NC%
echo.
REM 运行所有单元测试
set "PASSED_TESTS=0"
set "FAILED_TESTS=0"
set "TOTAL_TESTS=0"
for %%t in (%UNIT_TESTS%) do (
set "test_executable=%%t"
for %%i in ("!test_executable!") do set "test_name=%%~ni"
for %%i in ("!test_executable!\..\..") do set "test_module=%%~ni"
echo %BLUE%运行测试: !test_module!/!test_name!%NC%
REM 创建模块结果目录
if not exist "%UNIT_TEST_RESULTS_DIR%\!test_module!" mkdir "%UNIT_TEST_RESULTS_DIR%\!test_module!"
REM 运行测试并保存结果
set "xml_output=%UNIT_TEST_RESULTS_DIR%\!test_module!\!test_name!_result.xml"
set "text_output=%UNIT_TEST_RESULTS_DIR%\!test_module!\!test_name!_result.txt"
REM 运行测试
"!test_executable!" --gtest_output=xml:"!xml_output!" > "!text_output!" 2>&1
REM 检查测试结果
if !ERRORLEVEL! equ 0 (
echo %GREEN%测试通过: !test_module!/!test_name!%NC%
set /a PASSED_TESTS+=1
) else (
echo %RED%测试失败: !test_module!/!test_name! (退出码: !ERRORLEVEL!)%NC%
set /a FAILED_TESTS+=1
)
set /a TOTAL_TESTS+=1
echo.
)
REM 生成简单的HTML报告
set "HTML_REPORT=%UNIT_TEST_RESULTS_DIR%\unit_test_report.html"
(
echo ^<!DOCTYPE html^>
echo ^<html^>
echo ^<head^>
echo ^<meta charset="UTF-8"^>
echo ^<title^>音频后端单元测试报告^</title^>
echo ^<style^>
echo body { font-family: Arial, sans-serif; margin: 20px; }
echo h1 { color: #333; }
echo .summary { margin-bottom: 20px; }
echo .pass { color: green; }
echo .fail { color: red; }
echo table { border-collapse: collapse; width: 100%%; }
echo th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
echo th { background-color: #f2f2f2; }
echo tr:nth-child(even) { background-color: #f9f9f9; }
echo ^</style^>
echo ^</head^>
echo ^<body^>
echo ^<h1^>音频后端单元测试报告^</h1^>
echo ^<div class="summary"^>
echo ^<p^>总测试数: ^<strong^>%TOTAL_TESTS%^</strong^>^</p^>
echo ^<p^>通过: ^<strong class="pass"^>%PASSED_TESTS%^</strong^>^</p^>
echo ^<p^>失败: ^<strong class="fail"^>%FAILED_TESTS%^</strong^>^</p^>
echo ^</div^>
echo ^<h2^>测试详情^</h2^>
echo ^<table^>
echo ^<tr^>
echo ^<th^>测试模块^</th^>
echo ^<th^>测试名称^</th^>
echo ^<th^>结果^</th^>
echo ^<th^>详情链接^</th^>
echo ^</tr^>
) > "%HTML_REPORT%"
REM 添加测试详情到HTML报告
for %%t in (%UNIT_TESTS%) do (
set "test_executable=%%t"
for %%i in ("!test_executable!") do set "test_name=%%~ni"
for %%i in ("!test_executable!\..\..") do set "test_module=%%~ni"
set "xml_output=%UNIT_TEST_RESULTS_DIR%\!test_module!\!test_name!_result.xml"
set "text_output=%UNIT_TEST_RESULTS_DIR%\!test_module!\!test_name!_result.txt"
REM 检查XML输出是否存在以确定测试是否成功运行
if exist "!xml_output!" (
REM 从XML中提取失败测试数 (简单搜索failure标记)
findstr /C:"<failure" "!xml_output!" > nul
if !ERRORLEVEL! equ 1 (
set "result=通过"
set "result_class=pass"
) else (
set "result=失败"
set "result_class=fail"
)
) else (
set "result=错误"
set "result_class=fail"
)
REM 添加到HTML表格
(
echo ^<tr^>
echo ^<td^>!test_module!^</td^>
echo ^<td^>!test_name!^</td^>
echo ^<td class="!result_class!"^>!result!^</td^>
echo ^<td^>^<a href="!test_module!/!test_name!_result.txt"^>日志^</a^> ^| ^<a href="!test_module!/!test_name!_result.xml"^>XML^</a^>^</td^>
echo ^</tr^>
) >> "%HTML_REPORT%"
)
REM 完成HTML报告
(
echo ^</table^>
echo ^<p^>报告生成时间: %DATE% %TIME%^</p^>
echo ^</body^>
echo ^</html^>
) >> "%HTML_REPORT%"
echo %BLUE%=========================================================%NC%
echo %BLUE% 单元测试结果汇总 %NC%
echo %BLUE%=========================================================%NC%
echo 总测试数: %TOTAL_TESTS%
echo 通过: %GREEN%%PASSED_TESTS%%NC%
echo 失败: %RED%%FAILED_TESTS%%NC%
echo.
echo 详细报告已生成到: %YELLOW%%HTML_REPORT%%NC%
echo.
REM 返回测试结果
if %FAILED_TESTS% equ 0 (
echo %GREEN%所有单元测试通过!%NC%
exit /b 0
) else (
echo %RED%有单元测试失败!%NC%
exit /b 1
)