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())
# 直接修改任務代碼的返回結果,再執行單元測試時,打印的還是修改前的結果,需重啓項目,返回的結果纔會更新。