2010-01-11 116 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

相关问题