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())
# 直接修改任务代码的返回结果,再执行单元测试时,打印的还是修改前的结果,需重启项目,返回的结果才会更新。