2013-12-11 26 views
8

我問this關於如何編寫一個pytest來檢查stdout輸出的問題並得到了一個解決方案。現在我需要寫一個test case,檢查的內容寫入文件,按預期 內容被寫入如:編寫pytest函數來檢查輸出到python中的文件?

def writetoafile(): 
    file = open("output.txt",w) 
    file.write("hello\n") 
    file.write("world\n") 
    file.close() 

現在pytest功能檢查,如果它寫:

def test_writeToFile(): 
    file = open("ouput.txt",'r') 
    expected = "hello\nworld\n" 
    assert expected==file.read() 

雖然這似乎工作,我不認爲這是理想的,尤其是硬編碼。如何寫這些通常寫入文件的這種test functions

+0

爲什麼這不理想?你寫了你想要檢查的內容是否按預期寫入,所以查看文件並檢查似乎是最好的選擇。你總是可以用一系列隨機字符做一個變量,並檢查它是否寫入成功;你可以檢查「expected in file.read()」來查看數據是否被追加(但是你使用了'w'標誌,這是一個糟糕的測試)。等等。你想測試什麼,如果不是這樣?在大多數測試中,也許知道你想要的是真正的問題。 –

回答

12

tmpdir fixture這將創建一個每個測試臨時目錄。因此,一個測試將是這個樣子:

def writetoafile(fname): 
    with open(fname, 'w') as fp: 
     fp.write('Hello\n') 

def test_writetofile(tmpdir): 
    file = tmpdir.join('output.txt') 
    writetoafile(file.strpath) # or use str(file) 
    assert file.read() == 'Hello\n' 

在這裏,我們重構代碼不被任何硬編碼的,這是怎麼測試代碼讓你更好地設計它一個很好的例子。

+0

tmpdir做了什麼?所以它在內存中創建一個文件? –

+1

它創建了一個真正的目錄,您可以在之後檢查,在UNIX中,通常會在'/ tmp/pytest-xxxx'中找到它們,並使用符號鏈接進行最新的運行。你可以通過調用'py.test --fixtures'來學習fixtures,對於tmpdir的情況,請參考http://pytest.org/latest/tmpdir.html瞭解更多細節。 – flub