我使用pyinotify將文件從源目錄鏡像到目標目錄。當我手動執行它時,我的代碼似乎正在工作,但我無法獲得準確的單元測試結果。我認爲這個問題歸結爲:成功單元測試pyinotify?
- 我必須用在我的測試ThreadedNotifier ,否則會 只是掛,等待人工輸入。
- 因爲我正在使用另一個線程,所以我的測試和通告程序不同步。運行觀察性手動測試時通過的測試在運行單元測試時失敗。
有沒有人成功地進行過單元測試pyinotify?
我使用pyinotify將文件從源目錄鏡像到目標目錄。當我手動執行它時,我的代碼似乎正在工作,但我無法獲得準確的單元測試結果。我認爲這個問題歸結爲:成功單元測試pyinotify?
有沒有人成功地進行過單元測試pyinotify?
當單元測試時,線程和文件系統等事情通常應該被分解出來。你有沒有理由用實際的文件系統,用戶輸入等進行單元測試?
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
用諷刺庫只是使這個過程更容易,更靈活。
嘲笑是我還沒有研究過的,但我現在可能正在穿越那條路。除了上面的鏈接,還有沒有其他好的資源來從概念上學習模擬? – 2010-10-05 00:07:15