Files
lijiaoqiao/supply-api/scripts/production_test.sh

217 lines
7.9 KiB
Bash
Raw Normal View History

#!/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