Django 单元测试celery时的坑

1. 在单元测试里面创建了一个对象

deduct = DeductQueue.objects.create(user=User.objects.get(id=2), amount=2,
                                                xz_user_id=666,
                                                deduct_date=datetime.datetime.now(),
                                                log={}, deduct_type=DeductType.HEAT, coin_type=CoinType.HEAT,
                                                exchange_desc=TransferDesc.DAILY,
                                                exchange_type=ExchangeType.DAILY, )
r1 = re_deduct_heat.apply_async(args=(1,))
print(r1.get())

2. 执行的任务里面查找该对象

@app.task
def re_deduct_heat(pk):
    
    deduct = get_object_or_None(DeductQueue, pk=pk)
    return decuct.id

3. 发现找不到该对象

单元测试执行是打印的结果(r1.get()):NoneType has no 'id'

原因:单元测试是在临时数据库里创建的对象,但任务里执行查询的时候,是在项目的数据库里查找,可能是因为celery异步执行的原因。

4. 使用docker启动的项目,修改celery任务代码之后(reture 'fxx'更改为return 'fxx super man'),需重启项目(docker-compose down再docker-compose up),执行的代码才会更新。可能是因为celery任务代码在项目启动是加入到了缓存,修改任务代码时不会更新缓存。也有可能是创建了worker和scheduler容器的原因。通过测试发现,修改任务代码后,重启scheduler容器后执行任务未更新,重启worker容器后执行任务更新,所以应该是任务代码会在容器启动时缓存在worker容器中。

# 任务代码
@app.task
def fxx_super_man():
    return "fxx super man!"


# 单元测试代码
def test_add_task(self):
    """测试celery相加任务"""
    result = fxx_super_man.apply_async(args=())
    print(result.get())


# 直接修改任务代码的返回结果,再执行单元测试时,打印的还是修改前的结果,需重启项目,返回的结果才会更新。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章