2012-06-04 12 views
2

我有一個相當複雜的應用程序,使用芹菜,芒果,redis和金字塔。我用鼻子進行測試。我不是在做TDD(至少不是測試優先),但我非常努力地獲得一個體面的覆蓋率。我被困在與上述某些服務集成的部分。例如,我使用Redis的芹菜任務之間共享內存,但我希望能夠切換到memcache中沒有太多的麻煩,所以我抽象出來以下功能:我可以爲集成應用程序的各種服務製作測試假人嗎?

import settings 
db = StrictRedis(host=settings.db_uri, db=settings.db_name) 

def has_task(correlation_id): 
    """Return True if a task exists in db.""" 
    return db.exists(str(correlation_id)) 

def pop_task(correlation_id): 
    """Get a task from db by correlation_id.""" 
    correlation_id = str(correlation_id) # no unicode allowed 
    task_pickle = db.get(correlation_id) 
    task = loads(task_pickle) 
    if task: 
     db.delete(correlation_id) 
    return task 

def add_task(correlation_id, task_id, model): 
    """Add a task to db""" 
    return db.set(str(correlation_id), dumps((task_id, model))) 

我我也在做類似的事情來抽象Mongo,我用它來持久存儲。

我見過運行虛擬http服務器,創建虛擬請求甚至虛擬數據庫的集成web應用的測試套件。對於芹菜和金字塔我沒問題,但是我一直沒能找到mongo和redis的虛擬變量,所以當這些服務實際運行時,我只能運行上述測試。有沒有辦法提供上述虛擬服務,所以我有:

  1. 有安裝並運行外部服務,並
  2. 手動創建和銷燬整個數據庫(在內存中的假人可以指望清理後自己)
+0

不,我知道的,但它是一個很酷的想法。 – Nicholas

回答

2

我建議你使用mock library這樣的任務。這使您可以用一些僞對象替換生產對象(例如數據庫連接),這些僞對象可以提供一些測試所需的功能。

例子:

>>> from mock import Mock 
>>> db = Mock() 
>>> db.exists.return_value = True 
>>> db.exists() 
True 

您可以斷言你的代碼與模擬如何進行交互,例如:

>>> db.delete(1) 
<Mock name='mock.delete()' id='37588880'> 
>>> db.delete.assert_called_with(1) 
>>> db.delete.assert_called_with(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\mock.py", line 863, in assert_called_with 
    raise AssertionError(msg) 
AssertionError: Expected call: delete(2) 
Actual call: delete(1) 
相關問題