2010-01-11 113 views
31

我需要在沒有剩餘磁盤空間的情況下測試我的web應用程序,即我無法再編寫任何文件。但我不想用垃圾填滿我的硬盤,以確保沒有剩餘空間。我想要的是用特定的過程(實際上是一個PHP應用程序)來模擬這種情況。最簡單的方法來模擬沒有可用磁盤空間的情況?

確實,暫時禁止磁盤寫入進程必須足夠。

這樣做最簡單的方法是什麼?我正在使用帶有內置Apache/PHP軟件包的Mac OS X 10.6.2。謝謝。

編輯:磁盤空閒空間檢查不會是可靠的,因爲它可以隨時改變。許多頁面正在同時提供。檢查時可以有足夠的可用空間,但在您實際寫入內容時不會有空間。此外,檢查磁盤可用空間將需要在編寫文件的任何地方更改代碼,這不是我想要的:-)最後,此解決方案與我試圖測試的內容完全相反:我的應用程序如何在它不能再寫了。

回答

28

我敢打賭,你也可以創建自己的.dmg文件與文件系統的大小...說2Mb並寫入它。如果這樣做,那麼測試非常容易 - 只需安裝它並切換測試路徑即可。如果dmg足夠小,您甚至可以將其上傳到源代碼管理。

+4

或使用符號鏈接。 – Matt 2010-01-11 18:45:18

13

當我需要這樣做時,我創建了一個分配給虛擬磁盤空間有限的虛擬機。

4

我使用了一個拇指驅動器作爲該進程的卷。

2

快速簡便的解決方案是爲專門的用戶帳戶設置配額。 Quota support on Mac OS X

如果您不介意設置它的麻煩以及您的操作系統可能需要第二個許可證的事實,那麼虛擬機可能是具有最長期可能性的最佳想法。

-1

無論你獲得剩餘的磁盤空間,只是把它註釋掉,並用替換值,例如0.1,0運行你的應用程序,-1

+1

如果您依賴於某種「NoFreeDiskSpace」異常,則這不起作用。 – 2010-01-11 18:41:50

3

我不知道如何做到這一點的OSX但Linux,我可能會把我的測試用戶的磁盤配額,然後運行應用程序。

或者也許可以創建一個空文件(一個小文件),將其格式化爲ext3分區,使用環回設備裝載並在其中運行PHP應用程序。這將更接近空間不足的物理磁盤。

5

不需要使用預先填充的虛擬文件系統。
使用disk_free_space()嘲笑文件系統

disk_free_space() - 給定含目錄的字符串, 此函數將返回的字節的相應 文件系統或磁盤 分區可用數目 。

要模擬,只需將函數包裝到FileSystem類中即可。然後將它注入到班級中,並將其作爲依賴關係進行保存,並在實際保存之前檢查驅動器是否已滿。在你的UnitTest中,只需將班級嘲笑一個完整的文件系統,就可以完成課程。這樣,您無需重新創建整個磁盤驅動器,也無需隨時將驅動器與項目文件一起保存,無論何時您想重新運行測試,例如

class MyFileSystem 
{ 
    public static function df($drive) 
    { 
     return disk_free_space($drive); 
    } 
} 

和模擬一個完整的文件系統做

class MyFileSystemFull 
{ 
    public static function df($drive) 
    { 
     return 0; 
    } 
} 

如果你想重載函數在任何時候返回0,你可以使用RunKit PECL擴展,做:

runkit_function_redefine('disk_free_space','string','return 0;'); 

作爲替代看看vfsStream

vfsStream是虛擬文件系統的流包裝器,可能有助於單元測試來模擬真實的文件系統。它可以用於任何單元測試框架,如PHPUnit或SimpleTest。

+3

我對於php部分確實無能爲力,但這聽起來像是嘲弄你的依賴,這正是我想要做的。 – Mathias 2010-01-12 01:44:02

+0

@Mathias:是的,這就是它應該是。它可能需要一些調整來適應OP的代碼,但這是一個模擬。我已經更新了答案,使其更清晰。 – Gordon 2010-01-12 08:02:00

+0

聽起來像一個競爭條件的候選人。 – 2010-01-12 08:16:30

2

在常規文件(大小受限制)中創建磁盤/文件系統映像,然後循環掛載它。

但是如果你經常這樣做,我會創建一個虛擬機—你會發現重用它的機會。

1

難道你不能使用一個模擬,並用虛假的測試替換替代你的代碼中實際寫入磁盤的部分,它會拋出你期望看到的異常嗎?

0

遞歸地刪除您的應用程序要寫入的Web文件夾,文件夾和文件的所有寫入權限。

0

底線;不要這樣做。認真 - 有這麼多事情,當一個卷空間不足時,可怕的錯誤。除非目標卷是而不是啓動卷並且有其他應用程序,否則寫入磁盤的行爲將無法控制。

如果是啓動驅動器,無論如何系統很可能會出現恐慌或崩潰。或者,如果不是,它會表現不正常。

如果你正在談論數據量,是你的只有應用程序正在寫它?如果有其他應用程序正在編寫,你知道確定它們可能會失敗嗎?

這些天磁盤空間是如此的便宜,以至於確保磁盤空間不足根本不會發生。放入一個2TB驅動器,並在容量達到50%時發出警報。實施起來要便宜得多(除非你的時間是免費的),而且要可靠得多。

0

您是否嘗試過使用-f -r進行裝載?這不是非常低的磁盤空間,但它應該從同一級別引發錯誤。

0

我認爲模擬課程的想法是正確的方向。我通常也是這樣測試我的代碼。如果可能的話,我使用框架,而不是自己編寫這些類。我不太瞭解PHP(更多使用C#和Java編程),但這似乎很好。 https://github.com/padraic/mockery

相關問題