You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Pytest调用Celery遇Kombu连接拒绝,求本地及CI解决方案

解决Django+Celery测试中的RabbitMQ依赖问题

一、本地测试不用启动RabbitMQ的办法

1. 切换Celery测试模式(最简单)

直接在测试环境的配置文件里改Celery设置,让任务同步执行,完全绕开外部Broker依赖:

# settings/test.py
CELERY_BROKER_URL = 'memory://'  # 用内存作为临时Broker
CELERY_TASK_ALWAYS_EAGER = True  # 任务立即同步执行,不进队列
CELERY_TASK_EAGER_PROPAGATES = True  # 任务异常直接抛出,方便调试

这样跑测试时,Celery不会尝试连接RabbitMQ,任务直接在当前进程执行,完全不需要外部服务。

2. 单个测试Mock Celery任务

如果不想全局修改配置,针对触发任务的测试用例,直接Mock掉任务调用即可:

def test_stock_created_with_valid_data(api_client, stock_json, mocker):
    # Mock掉你的Celery任务的delay方法
    mock_task = mocker.patch('your_app.tasks.your_background_task.delay')
    
    # 执行测试动作
    res = api_client.post(reverse_lazy("core_api:stocks-list"), stock_json, format="json")
    
    # 验证任务是否被正确调用
    mock_task.assert_called_once_with(你预期的参数)

这种方法适合只需要验证任务是否被触发,不需要测试任务逻辑的场景。

3. 用pytest-celery插件管理测试环境

安装pytest-celery后,它会自动帮你搭建临时的Celery测试环境,不用手动配置:

pip install pytest-celery

然后在项目根目录的conftest.py里添加配置:

import pytest

@pytest.fixture(scope='session')
def celery_config():
    return {
        'broker_url': 'memory://',
        'result_backend': 'cache+memory://',
    }

跑测试时插件会自动应用这些配置,完全不需要启动RabbitMQ。

二、GitHub Actions中配置RabbitMQ服务

在你的CI配置文件(比如.github/workflows/tests.yml)里,通过services块启动RabbitMQ镜像,确保测试时Broker可用:

name: 运行测试

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      rabbitmq:
        image: rabbitmq:3.9-alpine  # 用轻量的Alpine镜像
        ports:
          - 5672:5672  # 映射端口到宿主机器
        # 等待RabbitMQ完全启动再执行测试
        options: >-
          --health-cmd "rabbitmq-diagnostics -q ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - uses: actions/checkout@v4
      - name: 设置Python环境
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
      - name: 安装依赖
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - name: 执行pytest
        run: pytest
        env:
          # 告诉Celery连接本地的RabbitMQ服务
          CELERY_BROKER_URL: amqp://guest:guest@localhost:5672//

配置里的health-cmd会检查RabbitMQ是否就绪,避免测试因Broker未启动而失败。

内容的提问来源于stack exchange,提问作者optimus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:48:21