Files
lijiaoqiao/supply-api/scripts/production_test.sh
2026-04-13 21:20:24 +08:00

217 lines
7.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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