message-pusher自动化测试流程:CI/CD集成实践

message-pusher自动化测试流程:CI/CD集成实践

【免费下载链接】message-pusher 搭建专属于你的消息推送服务,支持多种消息推送方式,支持 Markdown,基于 Golang 仅单可执行文件,开箱即用 【免费下载链接】message-pusher 项目地址: https://gitcode.com/GitHub_Trending/me/message-pusher

你是否还在手动测试消息推送服务的每个功能?当项目迭代到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)
}

项目logo

最佳实践与常见问题

测试覆盖率提升

重点覆盖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高可用部署方案"。

【免费下载链接】message-pusher 搭建专属于你的消息推送服务,支持多种消息推送方式,支持 Markdown,基于 Golang 仅单可执行文件,开箱即用 【免费下载链接】message-pusher 项目地址: https://gitcode.com/GitHub_Trending/me/message-pusher

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值