35

ディスク容量が残っていない、つまりこれ以上ファイルを書き込めないシナリオでWebアプリをテストする必要があります。しかし、本当にスペースが残っていないことを確認するためだけに、ハードドライブをジャンクでいっぱいにしたくありません。私が欲しいのは、特定のプロセス(実際にはPHPアプリ)でこの状況をシミュレートすることです。

実際、プロセスへのディスク書き込みを一時的に禁止するだけで十分なはずです。

これを行う最も簡単な方法は何ですか?Apache/PHPバンドルが組み込まれたMacOSX10.6.2を使用しています。ありがとう。

編集:ディスクの空き領域のチェックは、いつでも変更される可能性があるため、信頼性が低くなります。多くのページが同時に提供されています。チェックするときに十分な空き容量がある可能性がありますが、実際に何かを書いた瞬間にはありません。また、ディスクの空き容量を確認するには、ファイルを書き込むすべての場所でコードを変更する必要がありますが、これは私が望むものではありません:-)最後に、このソリューションは、テストしようとしているものとは正反対です。これ以上書き込むことはできません。

4

13 に答える 13

28

サイズが2Mbのファイルシステムで独自の.dmgファイルを作成して書き込むこともできると思います。これが機能する場合は、テストが非常に簡単です。マウントして、テストのパスを切り替えるだけです。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を返すようにしたい場合は、RunKitPecl拡張機能を使用して次の操作を行うことができます。

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では、おそらくテストユーザーにディスククォータを設定してからアプリを実行します。

または、nullファイル(小さなファイル)を作成し、ext3パーティションとしてフォーマットし、ループバックデバイスを使用してマウントし、その中でPHPアプリを実行することもできます。これは、スペースが不足している物理ディスクに近くなります。

于 2010-01-11T18:41:04.687 に答える
2

通常のファイル(サイズが制限されている)にディスク/ファイルシステムイメージを作成し、ループマウントします。

ただし、これを頻繁に行う場合は、仮想マシンを作成します。これを再利用する機会があります。

于 2010-01-11T19:14:04.310 に答える
2

迅速で簡単な解決策は、専用のユーザーアカウントの割り当てを設定することです。MacOSXでのクォータのサポート

セットアップの手間や、オペレーティングシステムに2つ目のライセンスが必要になる可能性があるという事実を気にしないのであれば、仮想マシンはおそらく最も長期的な可能性を秘めた最良のアイデアです。

于 2010-01-11T18:40:28.977 に答える
1

モックを使用して、実際にディスクに書き込むコードの一部を、予想される例外をスローする偽のテスト置換に置き換えることはできませんか?

于 2010-01-11T19:20:35.623 に答える
0

モッククラスの考え方は正しい方向だと思います。私は通常、自分のコードもそのようにテストします。可能であれば、それらのクラスを自分で作成する代わりに、そのためのフレームワークを使用します。私はPHPをよく知りません(C#とJavaを使ったプログラミングの詳細)が、これは素晴らしいようです。 https://github.com/padraic/mockery

于 2010-11-03T19:08:12.357 に答える
0

アプリが書き込むWebフォルダー、フォルダー、ファイルからすべての書き込み権限を再帰的に削除します。

于 2010-01-12T09:25:30.760 に答える
0

結論; そうしないでください。真剣に-ボリュームがスペースを使い果たしたときにひどくうまくいかないことがたくさんあります。対象のボリュームがブートボリュームではなく、他に1つのアプリケーションがボリュームに書き込んでいない場合を除いて、ディスクがいっぱいになったときの動作は、とにかく制御できなくなります。

それがブートドライブである場合、システムはとにかくフルディスクでパニックまたはクラッシュする可能性が非常に高いです。または、そうでない場合は、動作が不安定になります。

あなたがデータボリュームについて話しているなら、あなたはそれに書き込みをしている唯一のアプリですか?他のアプリが書いている場合、それらがどのように失敗するかを確実に知っていますか?

最近のディスク容量は非常に安いので、ディスク容量が不足することは決してありません。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 に答える