21

たくさんのコードのテストを書き始めたところです。ファイルシステムに依存するクラスがたくさんあります。つまり、CSVファイルの読み取り、構成ファイルの読み取り/書き込みなどです。

現在、テストファイルはプロジェクトのテストディレクトリ(Maven2プロジェクト)に保存されていますが、いくつかの理由でこのディレクトリが常に存在するとは限らないため、テストは失敗します。

ユニット/統合テストでファイルシステムの依存関係に対処するためのベストプラクティスを知っていますか?

編集:私は上で説明したその特定の問題の答えを探していません。それはほんの一例です。ファイルシステム/データベースなどへの依存関係を処理する方法についての一般的な推奨事項をお勧めします。

4

5 に答える 5

25

まず、単体テストをファイルシステムから遠ざけるようにしてください。このSet of Unit Testing Rules を参照してください。可能であれば、単体テスト用のバッファ (つまり、メモリ内) となる Streams と動作するコードと、本番コードの FileStream を使用するコードを用意してください。

これが不可能な場合は、単体テストで必要なファイルを生成することができます。これにより、すべてが 1 つのファイルにまとめられているため、テストが読みやすくなります。これにより、権限の問題も回避できます。

単体テストでファイルシステム/データベース/ネットワーク アクセスをモックできます。

DB またはファイル システムに依存する単体テストは、統合テストと見なすことができます。

于 2008-12-18T10:30:12.083 に答える
2

ファイルシステムへの依存関係には、次の 2 つの種類があります。

  • テストが依存するファイル。テストを実行するためにファイルが必要な場合は、テストでそれらを生成し、/tmpディレクトリに配置できます。
  • コードが依存しているファイル: 構成ファイルまたは入力ファイル。

この 2 番目のケースでは、多くの場合、コードを再構築してファイルへの依存を削除できます (たとえば、 java.io.File をjava.io.InputStreamandjava.io.OutputStreamに置き換えることができます)。もちろん、これは不可能な場合もあります。

また、ファイルシステムで「非決定論」を処理する必要がある場合もあります (NFS で何かをデバッグするという悪魔のような仕事が一度ありました)。この場合、おそらくファイル システムをシン インターフェイスでラップする必要があります。

簡単に言うと、これは File を受け取り、呼び出しをそのファイルに転送するヘルパー メソッドです。

InputStream getInputStream(File file) throws IOException {
    return new FileInputStream(file);
}

次に、これをモックに置き換えて、例外をスローしたり、 を返したりするように指示できますByteArrayInputStream

URL と URI についても同じことが言えます。

于 2008-12-18T10:47:45.323 に答える
1

ファイルから読み取る必要があるコードをテストするには、次の 2 つのオプションがあります。

  1. 単体テストに関連するファイルをソース管理 (テスト データ フォルダーなど) に保持して、最新のものを取得してテストを実行する人は、常に、テスト バイナリに関連する既知のフォルダーに関連ファイルを保持します。これはおそらく「ベストプラクティス」です。

  2. 問題のファイルが巨大な場合、それらをソース管理に保持したくない場合があります。この場合、すべての開発者およびビルド マシンからアクセスできるネットワーク共有は、おそらく妥当な妥協点です。

明らかに、適切に作成されたクラスのほとんどは、そもそもファイル システムに強い依存関係を持っていません。

于 2008-12-18T10:19:44.770 に答える
0

テスト ファイルには、単体テスト名と構造的に類似した名前を付けます。

たとえば、JUnit では、次のように使用します。

File reportFile = new File("tests/output/" + getClass().getSimpleName() + "/" + getName() + ".report.html");
于 2009-02-04T09:30:57.790 に答える
0

通常、ファイル システムのテストはそれほど重要ではありません。ファイル システムはよく理解されており、セットアップが簡単で、安定性を維持できます。また、アクセスは通常非常に高速であるため、それ自体を避けたり、テストをモックしたりする理由はありません。

ディレクトリが存在しない理由を調べて、存在することを確認することをお勧めします。たとえば、setUp() でファイルまたはディレクトリの存在を確認し、確認が失敗した場合はファイルをコピーします。これは 1 回だけ発生するため、パフォーマンスへの影響は最小限です。

于 2008-12-18T10:15:09.773 に答える