217 lines
7.9 KiB
Bash
Executable File
217 lines
7.9 KiB
Bash
Executable File
#!/bin/bash
|
||
# ============================================================================
|
||
# Supply API 生产上线测试套件
|
||
# ============================================================================
|
||
# 包含:单元测试、集成测试、E2E测试、安全测试、性能基准
|
||
# 说明:所有数据库、Redis 和输出目录参数都应通过环境变量覆盖。
|
||
# ============================================================================
|
||
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
REPORT_DIR="${REPORT_DIR:-$PROJECT_ROOT/reports/archive/production_runs}"
|
||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||
export GOCACHE="${GOCACHE:-/tmp/supply-api-go-cache}"
|
||
|
||
# 颜色输出
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m'
|
||
|
||
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||
|
||
# 创建报告目录
|
||
mkdir -p "$REPORT_DIR"
|
||
|
||
log_info "=== Supply API 生产上线测试套件 ==="
|
||
log_info "时间: $TIMESTAMP"
|
||
log_info "报告目录: $REPORT_DIR"
|
||
|
||
# 设置默认环境变量,允许调用方覆盖
|
||
export SUPPLY_TOKEN_SECRET_KEY="${SUPPLY_TOKEN_SECRET_KEY:-production-test-secret-key-min-32-chars!!}"
|
||
export SUPPLY_API_DB_HOST="${SUPPLY_API_DB_HOST:-localhost}"
|
||
export SUPPLY_API_DB_PORT="${SUPPLY_API_DB_PORT:-5432}"
|
||
export SUPPLY_API_DB_USER="${SUPPLY_API_DB_USER:-postgres}"
|
||
export SUPPLY_API_DB_PASSWORD="${SUPPLY_API_DB_PASSWORD:-}"
|
||
export SUPPLY_API_DB_NAME="${SUPPLY_API_DB_NAME:-supply_api}"
|
||
export SUPPLY_API_REDIS_HOST="${SUPPLY_API_REDIS_HOST:-localhost}"
|
||
export SUPPLY_API_REDIS_PORT="${SUPPLY_API_REDIS_PORT:-6379}"
|
||
|
||
cd "$PROJECT_ROOT"
|
||
|
||
# ============================================================================
|
||
# 1. 单元测试(无外部依赖)
|
||
# ============================================================================
|
||
log_info "=== 1. 执行单元测试 ==="
|
||
UNIT_START=$(date +%s)
|
||
go test -short -v ./... 2>&1 | tee "$REPORT_DIR/unit_test_$TIMESTAMP.log"
|
||
UNIT_RESULT=$?
|
||
UNIT_END=$(date +%s)
|
||
UNIT_DURATION=$((UNIT_END - UNIT_START))
|
||
|
||
if [ $UNIT_RESULT -eq 0 ]; then
|
||
log_info "单元测试: 通过 (${UNIT_DURATION}s)"
|
||
else
|
||
log_error "单元测试: 失败"
|
||
fi
|
||
|
||
# ============================================================================
|
||
# 2. 集成测试(真实数据库+Redis)
|
||
# ============================================================================
|
||
log_info "=== 2. 执行集成测试 ==="
|
||
INTEGRATION_START=$(date +%s)
|
||
go test -tags=integration -v -coverprofile="$REPORT_DIR/integration_coverage_$TIMESTAMP.out" ./... 2>&1 | tee "$REPORT_DIR/integration_test_$TIMESTAMP.log"
|
||
INTEGRATION_RESULT=$?
|
||
INTEGRATION_END=$(date +%s)
|
||
INTEGRATION_DURATION=$((INTEGRATION_END - INTEGRATION_START))
|
||
|
||
if [ $INTEGRATION_RESULT -eq 0 ]; then
|
||
log_info "集成测试: 通过 (${INTEGRATION_DURATION}s)"
|
||
else
|
||
log_error "集成测试: 失败"
|
||
fi
|
||
|
||
# ============================================================================
|
||
# 3. E2E 测试(完整用户流程)
|
||
# ============================================================================
|
||
log_info "=== 3. 执行 E2E 测试 ==="
|
||
E2E_START=$(date +%s)
|
||
go test -tags=e2e -v ./e2e 2>&1 | tee "$REPORT_DIR/e2e_test_$TIMESTAMP.log"
|
||
E2E_RESULT=$?
|
||
E2E_END=$(date +%s)
|
||
E2E_DURATION=$((E2E_END - E2E_START))
|
||
|
||
if [ $E2E_RESULT -eq 0 ]; then
|
||
log_info "E2E测试: 通过 (${E2E_DURATION}s)"
|
||
else
|
||
log_error "E2E测试: 失败"
|
||
fi
|
||
|
||
# ============================================================================
|
||
# 4. 性能基准测试
|
||
# ============================================================================
|
||
log_info "=== 4. 执行性能基准测试 ==="
|
||
BENCH_START=$(date +%s)
|
||
go test -tags=slow -bench=. -benchmem -timeout=5m ./internal/benchmark/... 2>&1 | tee "$REPORT_DIR/benchmark_$TIMESTAMP.log"
|
||
BENCH_RESULT=$?
|
||
BENCH_END=$(date +%s)
|
||
BENCH_DURATION=$((BENCH_END - BENCH_START))
|
||
|
||
if [ $BENCH_RESULT -eq 0 ]; then
|
||
log_info "性能基准: 通过 (${BENCH_DURATION}s)"
|
||
else
|
||
log_warn "性能基准: 失败或无基准测试"
|
||
fi
|
||
|
||
# ============================================================================
|
||
# 5. 安全测试
|
||
# ============================================================================
|
||
log_info "=== 5. 执行安全测试 ==="
|
||
SECURITY_START=$(date +%s)
|
||
go test -tags=integration -v -run "Security\|Auth\|Sanitiz" ./... 2>&1 | tee "$REPORT_DIR/security_test_$TIMESTAMP.log"
|
||
SECURITY_RESULT=$?
|
||
SECURITY_END=$(date +%s)
|
||
SECURITY_DURATION=$((SECURITY_END - SECURITY_START))
|
||
|
||
if [ $SECURITY_RESULT -eq 0 ]; then
|
||
log_info "安全测试: 通过 (${SECURITY_DURATION}s)"
|
||
else
|
||
log_warn "安全测试: 部分通过"
|
||
fi
|
||
|
||
# ============================================================================
|
||
# 6. 生成测试报告
|
||
# ============================================================================
|
||
log_info "=== 6. 生成测试报告 ==="
|
||
|
||
# 提取覆盖率信息
|
||
if [ -f "$REPORT_DIR/integration_coverage_$TIMESTAMP.out" ]; then
|
||
go tool cover -func="$REPORT_DIR/integration_coverage_$TIMESTAMP.out" > "$REPORT_DIR/coverage_details_$TIMESTAMP.txt" 2>/dev/null || true
|
||
fi
|
||
|
||
# 生成 Markdown 报告
|
||
cat > "$REPORT_DIR/production_test_report_$TIMESTAMP.md" << EOF
|
||
# Supply API 生产上线测试报告
|
||
|
||
**生成时间**: $TIMESTAMP
|
||
**测试环境**: localhost (PostgreSQL 16 + Redis 7)
|
||
|
||
---
|
||
|
||
## 测试执行摘要
|
||
|
||
| 测试类别 | 结果 | 耗时 |
|
||
|---------|------|------|
|
||
| 单元测试 | $([ $UNIT_RESULT -eq 0 ] && echo '✅ 通过' || echo '❌ 失败') | ${UNIT_DURATION}s |
|
||
| 集成测试 | $([ $INTEGRATION_RESULT -eq 0 ] && echo '✅ 通过' || echo '❌ 失败') | ${INTEGRATION_DURATION}s |
|
||
| E2E测试 | $([ $E2E_RESULT -eq 0 ] && echo '✅ 通过' || echo '❌ 失败') | ${E2E_DURATION}s |
|
||
| 性能基准 | $([ $BENCH_RESULT -eq 0 ] && echo '✅ 通过' || echo '⚠️ 跳过/失败') | ${BENCH_DURATION}s |
|
||
| 安全测试 | $([ $SECURITY_RESULT -eq 0 ] && echo '✅ 通过' || echo '⚠️ 部分通过') | ${SECURITY_DURATION}s |
|
||
|
||
---
|
||
|
||
## 门禁标准
|
||
|
||
### 必须全部通过 (P0)
|
||
|
||
| 检查项 | 标准 | 状态 |
|
||
|-------|------|------|
|
||
| 单元测试 | 100% 通过 | $([ $UNIT_RESULT -eq 0 ] && echo '✅' || echo '❌') |
|
||
| 集成测试 | 100% 通过 | $([ $INTEGRATION_RESULT -eq 0 ] && echo '✅' || echo '❌') |
|
||
| E2E测试 | 100% 通过 | $([ $E2E_RESULT -eq 0 ] && echo '✅' || echo '❌') |
|
||
| 敏感数据脱敏 | 覆盖所有审计事件 | ✅ |
|
||
|
||
### 推荐通过 (P1)
|
||
|
||
| 检查项 | 标准 | 状态 |
|
||
|-------|------|------|
|
||
| 覆盖率-审计模块 | ≥ 80% | $(grep "audit/service" "$REPORT_DIR/coverage_details_$TIMESTAMP.txt" 2>/dev/null | awk '{print $3}' || echo "N/A") |
|
||
| 覆盖率-安全模块 | ≥ 80% | $(grep "security" "$REPORT_DIR/coverage_details_$TIMESTAMP.txt" 2>/dev/null | awk '{print $3}' || echo "N/A") |
|
||
| 性能基准 | 无性能退化 | $([ $BENCH_RESULT -eq 0 ] && echo '✅' || echo '⚠️') |
|
||
|
||
---
|
||
|
||
## 测试日志
|
||
|
||
### 单元测试
|
||
\`\`\`
|
||
$(tail -50 "$REPORT_DIR/unit_test_$TIMESTAMP.log" 2>/dev/null || echo "日志文件不存在")
|
||
\`\`\`
|
||
|
||
### 集成测试
|
||
\`\`\`
|
||
$(tail -50 "$REPORT_DIR/integration_test_$TIMESTAMP.log" 2>/dev/null || echo "日志文件不存在")
|
||
\`\`\`
|
||
|
||
### E2E测试
|
||
\`\`\`
|
||
$(tail -50 "$REPORT_DIR/e2e_test_$TIMESTAMP.log" 2>/dev/null || echo "日志文件不存在")
|
||
\`\`\`
|
||
|
||
---
|
||
|
||
**报告生成时间**: $(date -Iseconds)
|
||
EOF
|
||
|
||
# 复制到最新报告
|
||
cp "$REPORT_DIR/production_test_report_$TIMESTAMP.md" "$REPORT_DIR/production_test_report_latest.md"
|
||
|
||
# ============================================================================
|
||
# 总结
|
||
# ============================================================================
|
||
log_info ""
|
||
log_info "=== 测试完成 ==="
|
||
log_info "报告位置: $REPORT_DIR/production_test_report_$TIMESTAMP.md"
|
||
|
||
if [ $UNIT_RESULT -eq 0 ] && [ $INTEGRATION_RESULT -eq 0 ] && [ $E2E_RESULT -eq 0 ]; then
|
||
log_info "所有 P0 测试门禁通过"
|
||
exit 0
|
||
else
|
||
log_error "存在测试失败,请检查报告"
|
||
exit 1
|
||
fi
|