2026-04-13 21:15:32 +08:00
#!/bin/bash
# ============================================================================
# Supply API 生产上线测试套件
# ============================================================================
# 包含: 单元测试、集成测试、E2E测试、安全测试、性能基准
2026-04-13 21:20:24 +08:00
# 说明: 所有数据库、Redis 和输出目录参数都应通过环境变量覆盖。
2026-04-13 21:15:32 +08:00
# ============================================================================
set -e
SCRIPT_DIR = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
PROJECT_ROOT = " $( dirname " $SCRIPT_DIR " ) "
2026-04-13 21:20:24 +08:00
REPORT_DIR = " ${ REPORT_DIR :- $PROJECT_ROOT /reports/archive/production_runs } "
2026-04-13 21:15:32 +08:00
TIMESTAMP = $( date +%Y%m%d_%H%M%S)
2026-04-13 21:20:24 +08:00
export GOCACHE = " ${ GOCACHE :- /tmp/supply-api-go-cache } "
2026-04-13 21:15:32 +08:00
# 颜色输出
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 "
2026-04-13 21:20:24 +08:00
# 设置默认环境变量,允许调用方覆盖
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 } "
2026-04-13 21:15:32 +08:00
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)
2026-04-13 21:20:24 +08:00
go test -tags= e2e -v ./e2e 2>& 1 | tee " $REPORT_DIR /e2e_test_ $TIMESTAMP .log "
2026-04-13 21:15:32 +08:00
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
2026-04-13 21:20:24 +08:00
log_info "所有 P0 测试门禁通过"
2026-04-13 21:15:32 +08:00
exit 0
else
2026-04-13 21:20:24 +08:00
log_error "存在测试失败,请检查报告"
2026-04-13 21:15:32 +08:00
exit 1
fi