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

230 lines
7.0 KiB
Bash

#!/bin/bash
# ================================================================================================
# Audio Backend - 集成测试运行脚本
# ================================================================================================
# 描述: 运行项目中的所有集成测试
# ================================================================================================
# 设置颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# 脚本所在的目录路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# 项目根目录
ROOT_DIR="$(dirname "$(dirname "$(dirname "$SCRIPT_DIR")")")"
# 构建目录
BUILD_DIR="$ROOT_DIR/build"
# 测试结果目录
TEST_RESULTS_DIR="$ROOT_DIR/test-results"
# 集成测试结果目录
INTEGRATION_TEST_RESULTS_DIR="$TEST_RESULTS_DIR/integration"
# 测试可执行文件目录
TEST_BIN_DIR="$BUILD_DIR/bin/tests"
# 打印脚本信息
echo -e "${BLUE}=========================================================${NC}"
echo -e "${BLUE} 音频后端集成测试运行脚本 ${NC}"
echo -e "${BLUE}=========================================================${NC}"
echo -e "${YELLOW}项目根目录: ${ROOT_DIR}${NC}"
echo -e "${YELLOW}测试结果录: ${INTEGRATION_TEST_RESULTS_DIR}${NC}"
echo ""
# 确保测试结果目录存在
mkdir -p "$INTEGRATION_TEST_RESULTS_DIR"
# 检查测试目录是否存在
if [ ! -d "$TEST_BIN_DIR" ]; then
echo -e "${RED}错误: 测试可执行文件目录不存在。请先构建项目。${NC}"
exit 1
fi
# 收集所有集成测试可执行文件
INTEGRATION_TESTS=()
if [ -d "$TEST_BIN_DIR/integration" ]; then
for test_file in "$TEST_BIN_DIR/integration"/*; do
if [ -x "$test_file" ]; then
INTEGRATION_TESTS+=("$test_file")
fi
done
fi
# 如果没有找到集成测试,显示警告并退出
if [ ${#INTEGRATION_TESTS[@]} -eq 0 ]; then
echo -e "${YELLOW}警告: 未找到集成测试可执行文件。${NC}"
exit 0
fi
echo -e "${BLUE}找到 ${#INTEGRATION_TESTS[@]} 个集成测试${NC}"
echo ""
# 准备测试环境
echo -e "${BLUE}准备集成测试环境...${NC}"
RESOURCES_DIR="$ROOT_DIR/tests/integration/resources"
if [ ! -d "$RESOURCES_DIR" ]; then
mkdir -p "$RESOURCES_DIR"
echo -e "创建测试资源目录: $RESOURCES_DIR"
fi
TEMP_DIR="$ROOT_DIR/tests/integration/temp"
if [ ! -d "$TEMP_DIR" ]; then
mkdir -p "$TEMP_DIR"
echo -e "创建临时测试目录: $TEMP_DIR"
fi
# 检查并创建测试插件目录
PLUGINS_DIR="$RESOURCES_DIR/plugins"
if [ ! -d "$PLUGINS_DIR" ]; then
mkdir -p "$PLUGINS_DIR"
echo -e "创建测试插件目录: $PLUGINS_DIR"
fi
# 检查并创建测试配置目录
CONFIG_DIR="$RESOURCES_DIR/config"
if [ ! -d "$CONFIG_DIR" ]; then
mkdir -p "$CONFIG_DIR"
echo -e "创建测试配置目录: $CONFIG_DIR"
fi
# 检查并创建测试音频文件目录
AUDIO_FILES_DIR="$RESOURCES_DIR/audio"
if [ ! -d "$AUDIO_FILES_DIR" ]; then
mkdir -p "$AUDIO_FILES_DIR"
echo -e "创建测试音频文件目录: $AUDIO_FILES_DIR"
fi
echo -e "${GREEN}集成测试环境准备完成${NC}"
echo ""
# 运行所有集成测试
PASSED_TESTS=0
FAILED_TESTS=0
TOTAL_TESTS=0
for test_executable in "${INTEGRATION_TESTS[@]}"; do
test_name=$(basename "$test_executable")
echo -e "${BLUE}运行测试: ${test_name}${NC}"
# 创建结果目录
mkdir -p "$INTEGRATION_TEST_RESULTS_DIR"
# 运行测试并保存结果
xml_output="$INTEGRATION_TEST_RESULTS_DIR/${test_name}_result.xml"
text_output="$INTEGRATION_TEST_RESULTS_DIR/${test_name}_result.txt"
# 运行测试
"$test_executable" --gtest_output=xml:"$xml_output" | tee "$text_output"
test_result=${PIPESTATUS[0]}
# 统计测试结果
if [ $test_result -eq 0 ]; then
echo -e "${GREEN}测试通过: ${test_name}${NC}"
((PASSED_TESTS++))
else
echo -e "${RED}测试失败: ${test_name} (退出码: $test_result)${NC}"
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
echo ""
done
# 生成简单的HTML报告
HTML_REPORT="$INTEGRATION_TEST_RESULTS_DIR/integration_test_report.html"
cat > "$HTML_REPORT" <<EOF
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>音频后端集成测试报告</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
h1 { color: #333; }
.summary { margin-bottom: 20px; }
.pass { color: green; }
.fail { color: red; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
</head>
<body>
<h1>音频后端集成测试报告</h1>
<div class="summary">
<p>总测试数: <strong>${TOTAL_TESTS}</strong></p>
<p>通过: <strong class="pass">${PASSED_TESTS}</strong></p>
<p>失败: <strong class="fail">${FAILED_TESTS}</strong></p>
</div>
<h2>测试详情</h2>
<table>
<tr>
<th>测试名称</th>
<th>结果</th>
<th>详情链接</th>
</tr>
EOF
# 添加测试详情到HTML报告
for test_executable in "${INTEGRATION_TESTS[@]}"; do
test_name=$(basename "$test_executable")
xml_output="$INTEGRATION_TEST_RESULTS_DIR/${test_name}_result.xml"
text_output="$INTEGRATION_TEST_RESULTS_DIR/${test_name}_result.txt"
# 检查XML输出是否存在以确定测试是否成功运行
if [ -f "$xml_output" ]; then
# 从XML中提取失败测试数
failures=$(grep -c "<failure" "$xml_output" || echo "0")
if [ "$failures" -eq "0" ]; then
result="通过"
result_class="pass"
else
result="失败"
result_class="fail"
fi
else
result="错误"
result_class="fail"
failures="N/A"
fi
# 添加到HTML表格
cat >> "$HTML_REPORT" <<EOF
<tr>
<td>${test_name}</td>
<td class="${result_class}">${result}</td>
<td><a href="${test_name}_result.txt">日志</a> | <a href="${test_name}_result.xml">XML</a></td>
</tr>
EOF
done
# 完成HTML报告
cat >> "$HTML_REPORT" <<EOF
</table>
<p>报告生成时间: $(date)</p>
</body>
</html>
EOF
echo -e "${BLUE}=========================================================${NC}"
echo -e "${BLUE} 集成测试结果汇总 ${NC}"
echo -e "${BLUE}=========================================================${NC}"
echo -e "总测试数: ${TOTAL_TESTS}"
echo -e "通过: ${GREEN}${PASSED_TESTS}${NC}"
echo -e "失败: ${RED}${FAILED_TESTS}${NC}"
echo ""
echo -e "详细报告已生成到: ${YELLOW}${HTML_REPORT}${NC}"
echo ""
# 返回测试结果
if [ $FAILED_TESTS -eq 0 ]; then
echo -e "${GREEN}所有集成测试通过!${NC}"
exit 0
else
echo -e "${RED}有集成测试失败!${NC}"
exit 1
fi