2010-11-16 38 views
21

(我正在使用Python 2.6和nose。)Python:我如何在我的測試套件中創建臨時文件?

我正在爲我的Python應用程序編寫測試。我想要一個測試來打開一個新文件,關閉它,然後刪除它。當然,我更喜歡這會發生在一個臨時目錄中,因爲我不想垃圾用戶的文件系統。而且,它需要跨OS。

我該怎麼做?

回答

12

查看標準庫中的tempfile模塊 - 應該是您所需要的。使用

25

FWIW py.test你可以寫:

def test_function(tmpdir): 
    # tmpdir is a unique-per-test-function invocation temporary directory 

使用「TMPDIR」功能參數將得到一個乾淨的空目錄中的每個測試功能,爲的/ tmp/pytest-NUM的」子目錄中創建「(linux,win32有不同的路徑),其中每次測試都增加NUM。最後三個目錄保留以便檢查,舊的目錄會自動刪除。您也可以使用py.test --basetemp=mytmpdir設置基本臨時目錄。

的TMPDIR對象是py.path.local對象,也可以使用這樣的:

sub = tmpdir.mkdir("sub") 
sub.join("testfile.txt").write("content") 

但它也蠻好,只是它轉換成「串」路徑:

tmpdir = str(tmpdir) 
+0

可以''tmpdir' funcarg與py.test中的setup/teardown xUnit方法一起使用嗎?所以例如從'def setup_method(self,method)'改成'def setup_method(self,method,tmpdir)'? – KomodoDave 2013-08-16 21:09:06

+0

如果你用''@ pytest.fixture(autouse = True)'裝飾你的設置方法,可以使用tmpdir,在這種情況下,''setup_method''可以接收fixtures作爲正常的pytest fixture。請參閱固定裝置文檔以瞭解固定裝置的含義。 – hpk42 2013-09-06 12:42:28

4

直接使用tempfile我建議使用上下文管理器包裝器 - 上下文管理器負責在基本上沒有樣板的情況下在所有情況下(成功/失敗/異常)移除目錄。

這裏是如何可以用:

from tempdir import TempDir 
... 

# in some test: 
with TempDir() as d: 
    temp_file_name = os.path.join(d.name, 'your_temp_file.name') 
    # create file... 
    # ... 
    # asserts... 

我一直用一個本土版(實現很短 - 下20線)到一點,當我需要的地方使用它否則,所以我查看了是否有一個包可以安裝,確實有:tempdir

+0

tempdir不在標準庫中:'''ImportError:沒有名爲tempdir的模塊''' – dashesy 2015-02-04 00:12:27

+0

這個包不能被pip找到! 'pip3 search tempdir'什麼都不顯示。 – kap 2015-09-03 07:44:52

+0

我嘗試它時得到了這個:AttributeError:__exit__ – 2016-09-06 13:07:36

相關問題