35

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

实际上,暂时禁止对进程进行磁盘写入就足够了。

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

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

4

13 回答 13

28

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

于 2010-01-11T18:44:11.733 回答
14

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

于 2010-01-11T18:38:38.340 回答
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。

于 2010-01-11T18:46:54.843 回答
4

我使用拇指驱动器作为该过程的音量。

于 2010-01-11T18:39:59.880 回答
3

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

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

于 2010-01-11T18:41:04.687 回答
2

Create a disk/filesystem image in a regular file (of limited size) and loop mount it.

But if you'll be doing this often I'd create a virtual machine—you'll find opportunity to reuse it.

于 2010-01-11T19:14:04.310 回答
2

一个快速简单的解决方案是为专门的用户帐户设置配额。Mac OS X 上的配额支持

如果您不介意设置它的麻烦,并且您可能需要为您的操作系统提供第二个许可证这一事实,那么虚拟机可能是具有最长期可能性的最佳主意。

于 2010-01-11T18:40:28.977 回答
1

您不能使用 Mock,并用虚假的测试替换替换实际写入磁盘的代码部分,这会引发您希望看到的异常吗?

于 2010-01-11T19:20:35.623 回答
0

recursively remove all write permissions from your webfolder, folders and files your app is going to write to.

于 2010-01-12T09:25:30.760 回答
0

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

于 2010-11-03T19:08:12.357 回答
0

底线;不要那样做。说真的——当一个卷空间用完时,有很多事情会出现可怕的错误。除非目标卷不是引导卷并且没有其他应用程序写入它,否则磁盘填充时的行为无论如何都将超出您的控制。

如果它是引导驱动器,无论如何,系统很可能会在满盘时出现恐慌或崩溃。或者,如果不是,它的行为会不正常。

如果您正在谈论数据量,那么您的应用程序是唯一写入它的应用程序吗?如果有任何其他应用程序正在编写,您是否确定它们可能会失败?

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

于 2010-01-14T04:07:26.740 回答
0

你试过用 -f -r 挂载吗?这并不是真正的低磁盘空间,但它应该从同一级别引发错误。

于 2010-01-18T17:21:10.290 回答
-1

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

于 2010-01-11T18:40:33.890 回答