最简单的方法来模拟没有可用磁盘空间的情况?

时间:2010-01-11 18:37:16

标签: php apache macos testing diskspace

我需要在没有剩余磁盘空间的情况下测试我的Web应用程序,即我无法再写入任何文件。但我不想用垃圾填满我的硬盘只是为了确保没有剩余的空间。我想要的是用特定的过程模拟这种情况(实际上是一个PHP应用程序)。

实际上,暂时禁止磁盘写入进程必须足够。

最简单的方法是什么?我正在使用带有内置Apache / PHP软件包的Mac OS X 10.6.2。感谢。

编辑:磁盘可用空间检查不可靠,因为它可以随时更改。许多页面同时提供。检查时可以有足够的可用空间,但是当你实际写东西时没有空间。此外,检查磁盘可用空间将需要在我写入文件的任何地方更改代码,这不是我想要的:-)最后,这个解决方案与我正在尝试测试的完全相反:我的应用程序将在何时表现它不能再写了。

13 个答案:

答案 0 :(得分:28)

我打赌你也可以创建自己的.dmg文件,文件系统大小...说2Mb并写入它。如果这样可行,那么它非常容易进行测试 - 您只需安装它并切换测试路径即可。如果dmg足够小,你甚至可以将它上传到源代码控制。

答案 1 :(得分:13)

当我需要这样做时,我创建了一个分配给虚拟磁盘的空间有限的虚拟机。

答案 2 :(得分:5)

无需使用预先填充的虚拟文件系统 使用disk_free_space()模拟FileSystem

  

disk_free_space() - 给定一个包含目录的字符串,   此函数将返回该数字   可用的字节数   相应的文件系统或磁盘   分区。

要模拟,只需将函数包装到FileSystem类中。然后将它注入到您的类中,将保存作为依赖项并在执行实际保存之前检查驱动器是否已满。在你的UnitTest中,只需用模拟完整文件系统的类替换常规类,你就完成了。这样,无论何时想要重新运行测试,都不必重新创建完整的磁盘驱动器或将驱动器与项目文件保持在一起,例如。

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

并模拟完整的FileSystem

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 :(得分:4)

我使用了拇指驱动器作为过程的体积。

答案 4 :(得分:3)

我不确定如何在OSX上执行此操作,但在Linux上,我可能会在我的测试用户上设置磁盘配额,然后运行该应用程序。

或者可以创建一个空文件(一个小文件),将其格式化为ext3分区,使用loopback设备安装它并在其中运行PHP应用程序。这将更接近于空间不足的物理磁盘。

答案 5 :(得分:2)

快速简便的解决方案是为专门的用户帐户设置配额。 Quota support on Mac OS X

如果您不介意设置它的麻烦,以及您可能需要为您的操作系统获得第二个许可证的事实,虚拟机可能是具有最长期可能性的最佳创意。

答案 6 :(得分:2)

在常规文件(大小有限)中创建磁盘/文件系统映像并循环安装。

但是如果你经常这样做我会创建一个虚拟机 - 你会找到重用它的机会。

答案 7 :(得分:1)

你不能使用Mock,并用你的代码部分替换实际写入磁盘的部分,并使用假的测试替代品来抛出你期望看到的异常吗?

答案 8 :(得分:0)

以递归方式删除您的应用将要写入的网络文件夹,文件夹和文件的所有写入权限。

答案 9 :(得分:0)

底线;不要那样做。说真的 - 当音量空间不足时,有很多东西会出现可怕的错误。除非目标卷启动卷并且没有其他应用程序写入,否则磁盘填充的行为无论如何都将无法控制。

如果是启动驱动器,系统很可能会在完整磁盘上发生混乱或崩溃。或者,如果没有,它会表现得不正常。

如果您正在谈论数据卷,那么您的应用是否正在写入?如果有任何其他应用正在编写,您是否知道以确定它们可能会失败?

如今,磁盘空间非常便宜,以至于确保磁盘空间不足将永远不会发生。放入2TB驱动器并在达到50%容量时发出警报。实施起来便宜得多(除非你的时间是免费的),而且更加可靠。

答案 10 :(得分:0)

您是否尝试使用-f -r安装?它不是真正的低磁盘空间,但它应该从同一级别引发错误。

答案 11 :(得分:0)

我认为模拟课的想法是正确的方向。我通常也会测试我的代码。如果可能的话,我会使用一个框架,而不是自己编写这些类。我不太了解PHP(使用C#和Java编程更多),但这似乎很好。 https://github.com/padraic/mockery

答案 12 :(得分:-1)

无论您获得剩余的磁盘空间,只需将其注释掉并使用替换值(例如0.1,0,-1)运行您的应用