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())


# 直接修改任務代碼的返回結果,再執行單元測試時,打印的還是修改前的結果,需重啓項目,返回的結果纔會更新。

 

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