簡體   English   中英

如何對運行芹菜任務的代碼進行單元測試?

[英]How to unit test code that runs celery tasks?

我正在開發的應用程序是高度異步的。 Web 應用程序根據用戶操作通過 celery 運行許多任務。 celery 任務本身能夠啟動進一步的任務。

如下所示的代碼在我們的代碼庫中經常出現。

def do_sth():
    logic();
    if condition:
         function1.apply_async(*args)
    else:
         function2.apply_asynch(*args)

現在我們想開始對我們編寫的任何新代碼進行單元測試,但我們不確定如何執行此操作。 我們想在我們的pytest單元測試中斷言我們想看看 function1 是否真的被調用了。 我們不希望一定運行function1本身,我們將會對單元測試function1

我不想將 celery 作為一個進程運行,我也不想在單元測試會話期間運行任何 AMQP 代理。

這是可以實現的嗎?

編輯

有人指出,這是如何對 Celery 任務進行單元測試?

它不是。 想想看。 我要問的是如何測試函數是否通過 apply_async 調用了function1 這個問題是關於我如何測試function1本身。 有很大的不同。 在制定這個問題之前,我確實遇到了這個問題。

看看unittest.mock模塊,它允許用“模擬”替換您不想調用的函數,這些“模擬”看起來與原始函數非常相似,以說服調用代碼它正在調用“真實的東西”。 然后,您可以檢查是否實際調用了模擬以及使用了哪些參數。 例子:

from unittest.mock import patch

def test_do_sth():
    with patch('function1.apply_async') as function1_mock:
        do_sth()
        assert function1_mock.called

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM