我有一個Python項目,在該項目中,我讀取外部文件,處理它們並將結果寫入新文件。輸入文件可以直接讀取,也可以使用git show
從git存儲庫中提取。該函數調用git show
和返回標準輸出看起來是這樣的:使用子進程的單元測試Python代碼.Popen
def git_show(fname, rev):
'''Runs git show and returns stdout'''
process = subprocess.Popen(['git', 'show', '{}:{}'.format(rev, fname)],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
ret_code = process.wait()
if ret_code:
raise Exception(stderr)
return stdout
我有一個測試程序的整個處理部分單元測試,即一切除了讀取和寫入文件。但是,我偶然發現了(並修正了)關於從git_show()
返回的字符串編碼的問題,這取決於Python版本,很可能是操作系統和實際讀取的文件。
我想爲git_show()
設置單元測試,這樣我就可以確保整個應用程序從輸入到輸出都能正常工作。不過,據我所知,這是不可能的,沒有一個實際的git存儲庫進行測試。整個軟件包是使用git進行版本管理的,我希望如果我在git存儲庫中有一個git倉庫,可能會導致問題,並且我腦子裏的聲音告訴我,這可能不是最好的解決方案。
如何才能最好地實現從0(和通常命令行/ Popen.communicate()
)得到輸入的單元測試代碼?
1。這是否需要「py.test」或「unittest」足夠? 2.您正在創建一個源自python文件的字符串。是否存在重要的編碼影響,或者你的例子中的''stdout.read()''是否肯定會返回完全相同的字符串/編碼,就好像你在具有相同字符串的文件上調用''git show'' ,不管文件如何保存? – cmeeren
否; pytest不是必需的;你*可以*使用unittest。您將獲得Python 3.x中的字節和Python 2.x中的str(*相當於字節*); ''stdout''將包含''git show''的輸出 –
謝謝,會測試一下並看看。這對Win/Mac/Linux是否正確,並且應該在所有三個方面都「回聲」? – cmeeren