message-pusher自动化测试流程:CI/CD集成实践
你是否还在手动测试消息推送服务的每个功能?当项目迭代到v0.4版本时,数据库迁移是否让你焦头烂额?本文将带你从零构建message-pusher的自动化测试与CI/CD流程,解决版本迭代中的兼容性问题,确保服务稳定交付。读完本文你将掌握:Docker容器化测试环境搭建、多通道推送功能自动化验证、GitHub Actions持续集成配置,以及一键部署策略。
测试环境容器化配置
message-pusher采用Docker容器化部署,为测试环境提供了一致性保障。通过Docker Compose可以快速搭建包含应用服务和数据卷的隔离环境,确保测试结果不受本地环境干扰。
项目的docker-compose.yml定义了基础服务配置:
version: "3"
services:
message-pusher:
image: justsong/message-pusher
restart: unless-stopped
ports:
- 3000:3000
environment:
- TZ=Asia/Shanghai
volumes:
- ./data:/data
- /etc/localtime:/etc/localtime:ro
为支持测试需求,需扩展此配置添加测试依赖服务:
services:
# 原有服务配置...
redis:
image: redis:alpine
ports:
- 6379:6379
volumes:
- redis-data:/data
test-runner:
image: golang:1.20-alpine
volumes:
- .:/app
- go-mod:/go/pkg/mod
working_dir: /app
command: sh -c "go test ./... -v"
volumes:
redis-data:
go-mod:
自动化测试策略设计
单元测试架构
message-pusher核心推送逻辑位于channel/目录,包含16种消息通道实现。以企业微信推送为例,corp.go实现了企业微信应用号和群机器人两种推送方式,需要针对不同消息类型编写单元测试:
func TestCorpAppPush(t *testing.T) {
// 初始化测试配置
config := &CorpAppConfig{
CorpID: os.Getenv("TEST_CORP_ID"),
AgentID: os.Getenv("TEST_AGENT_ID"),
Secret: os.Getenv("TEST_CORP_SECRET"),
}
// 创建测试用例
testCases := []struct {
name string
content string
expect bool
}{
{"文本消息", "测试文本推送", true},
{"Markdown消息", "**测试加粗文本**", true},
{"空消息", "", false},
}
// 执行测试
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := PushCorpAppMessage(config, tc.content)
assert.Equal(t, tc.expect, result)
})
}
}
集成测试流程
集成测试重点验证多组件协同工作,特别是数据库交互和异步消息队列。项目使用SQLite作为默认数据库,测试时需通过common/redis.go配置Redis进行分布式锁和限流测试:
// 测试消息队列异步推送
func TestMessageQueue(t *testing.T) {
// 初始化队列
queue := NewMessageQueue(redisClient)
// 模拟并发推送
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
msg := &Message{
ID: id,
Content: fmt.Sprintf("测试消息 %d", id),
Channel: "test",
}
queue.Push(msg)
}(i)
}
wg.Wait()
// 验证队列处理结果
assert.Equal(t, 0, queue.Length())
}
端到端测试场景
端到端测试模拟真实用户场景,通过Web API调用验证完整业务流程。使用curl命令测试消息推送API:
# 测试企业微信推送
curl -X POST http://localhost:3000/push/test \
-H "Content-Type: application/json" \
-d '{"title":"CI测试","description":"来自自动化测试的推送","channel":"corp","token":"test_token"}'
CI/CD流水线实现
GitHub Actions工作流配置
在项目根目录创建.github/workflows/ci.yml文件,实现自动化测试与部署:
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.20'
- name: Install dependencies
run: |
cd web && npm install && npm run build
cd .. && go mod download
- name: Run tests
run: go test -v ./...
- name: Build
run: go build -ldflags "-s -w" -o message-pusher
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: justsong/message-pusher:latest
环境变量管理
敏感配置如API密钥通过GitHub Secrets管理,在工作流中注入:
env:
TEST_CORP_ID: ${{ secrets.TEST_CORP_ID }}
TEST_AGENT_ID: ${{ secrets.TEST_AGENT_ID }}
REDIS_CONN_STRING: ${{ secrets.REDIS_CONN_STRING }}
部署策略
采用蓝绿部署策略,通过Docker Compose实现无缝更新:
# 启动新版本容器
docker-compose -f docker-compose.prod.yml up -d --no-deps message-pusher-new
# 健康检查
docker run --network container:message-pusher-new curl -s http://localhost:3000/health
# 切换流量
docker-compose -f docker-compose.prod.yml up -d --renew-anon-volumes message-pusher
# 下线旧版本
docker-compose -f docker-compose.prod.yml down message-pusher-old
测试结果可视化与告警
测试报告生成
使用Go内置测试工具生成JSON格式报告,结合common/logger.go实现测试结果日志记录:
go test ./... -json > test-report.json
消息推送测试告警
利用项目自身的多通道推送能力,将测试结果实时推送到企业微信:
func SendTestReport(report *TestReport) error {
config := &CorpAppConfig{
CorpID: os.Getenv("ALERT_CORP_ID"),
AgentID: os.Getenv("ALERT_AGENT_ID"),
Secret: os.Getenv("ALERT_CORP_SECRET"),
}
content := fmt.Sprintf("测试完成: %d通过, %d失败\n%s",
report.Passed, report.Failed, report.FailureDetails)
return PushCorpAppMessage(config, content)
}
最佳实践与常见问题
测试覆盖率提升
重点覆盖channel/目录下的核心推送通道,确保企业微信、飞书等关键通道的测试覆盖率达到90%以上:
go test -coverprofile=coverage.out ./channel
go tool cover -func=coverage.out | grep -v "100.0%"
数据库迁移测试
针对v0.3到v0.4的数据库结构变更,编写专项测试验证迁移脚本:
func TestMigrateV3ToV4(t *testing.T) {
// 初始化v0.3版本数据库
db := initOldDatabase()
// 执行迁移脚本
err := MigrateV3ToV4(db)
assert.NoError(t, err)
// 验证表结构和数据
verifyNewSchema(db)
verifyDataConsistency(db)
}
性能测试
使用controller/message.go中的批量推送接口,测试系统在高并发场景下的表现:
# 模拟100并发推送请求
ab -n 1000 -c 100 -T application/json \
-p test-data.json http://localhost:3000/api/messages/batch
总结与展望
本文详细介绍了message-pusher项目的自动化测试与CI/CD实践,通过Docker容器化解决了测试环境一致性问题,设计了覆盖单元测试、集成测试和端到端测试的完整测试体系,并基于GitHub Actions实现了持续集成与部署。这些措施有效降低了版本迭代风险,特别是数据库迁移等关键变更的安全性。
下一步计划引入混沌工程实践,通过随机注入故障来验证系统的弹性能力,进一步提升服务稳定性。同时优化测试效率,将整体测试时间从当前的15分钟缩短至5分钟内,支持更频繁的迭代发布。
欢迎点赞收藏本文,关注项目README.md获取最新更新,下期将带来"message-pusher高可用部署方案"。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




