2010-10-04 83 views
3

我使用pyinotify將文件從源目錄鏡像到目標目錄。當我手動執行它時,我的代碼似乎正在工作,但我無法獲得準確的單元測試結果。我認爲這個問題歸結爲:成功單元測試pyinotify?

  1. 我必須用在我的測試ThreadedNotifier ,否則會 只是掛,等待人工輸入。
  2. 因爲我正在使用另一個線程,所以我的測試和通告程序不同步。運行觀察性手動測試時通過的測試在運行單元測試時失敗。

有沒有人成功地進行過單元測試pyinotify?

回答

5

當單元測試時,線程和文件系統等事情通常應該被分解出來。你有沒有理由用實際的文件系統,用戶輸入等進行單元測試?

Python使猴子很容易修補;例如,你可以用一個模擬對象(例如Python Mock)替換整個os/sys模塊,這樣你永遠不需要處理文件系統。這也將使你的測試運行得更快。

如果您想使用文件系統進行功能測試,我建議您設置一個虛擬機,該虛擬機將具有已知狀態,並在您每次運行測試時恢復到該狀態。您還可以根據需要模擬用戶輸入,文件操作等。

編輯

下面是如何捏造的一個簡單的例子,或嘲笑的「開放式」的功能。

說你已經有了一個模塊,my_module,具有get_text_upper功能:

def get_text_upper(filename): 
    return open(filename).read().upper() 

你要測試的這款沒有實際觸摸文件系統(最終你會開始只是路過文件對象,而不是文件名字,以避免這一點,但現在...)。因此,它返回一個StringIO的對象,而不是你可以嘲笑open功能:

from cStringIO import StringIO 

def fake_open(text): 
    fp = StringIO() 
    fp.write(text) 
    fp.seek(0) 
    return fp 

def test_get_text(): 
    my_module.open = lambda *args, **kwargs : fake_open("foo") 
    text = my_module.get_text_upper("foo.txt") 
    assert text == "FOO", text 

用諷刺庫只是使這個過程更容易,更靈活。

這是stackoverflow post on mocking libraries for python

+0

嘲笑是我還沒有研究過的,但我現在可能正在穿越那條路。除了上面的鏈接,還有沒有其他好的資源來從概念上學習模擬? – 2010-10-05 00:07:15