2009-07-10 10 views
3

私はParasoftのC++テストを使用してC++コードの単体テストを行っています。 次の問題が発生しました。この場合ファイル入力の出力を伴うメソッドのユニットテストを行う方法は?

bool LoadFileToMem(const std::string& rStrFileName) 
{ 
    if(openfile(rStrFileName) == successfull) 
    { 
     if(get_file_size() == successfull) 
     { 
      if(read_entire_file_to_buffer() == successfull) 
      { 
       return true; 
      } 
      return false; 
     } 
     return false; 
    } 
    return false; 
} 

私の質問は次のとおりです:

は、私は、ファイルシステム関数のスタブを使用する必要が私は次の(擬似コード)と同様の機能を持っていますか?または、ユニットテストを実行するための特定のサンプルテストファイルを含める必要がありますか?

私の場合、ファイル入力にはstd::fstreamクラスが使用されます。

もっと良い提案がありますか? (C++テストでは最適ですが、必須ではありません)。

答えて

3

この関数のユニットテストでは、呼び出される各関数にスタブを使用する必要があります。

それぞれの呼び出された関数は、その関数を実行する独自のユニットテストスイートを持っています。

read_entire_file_to_buffer()の場合、40文字の設定ファイルではなくニューヨーク証券取引所の履歴をフィードしたときにクラッシュせずに焼き付かないことを確認するために、バッファをオーバーフローさせるテストファイルが少なくとも1つ必要です。期待している。

+0

正しいですが、バッファはファイルのサイズと等しくなるように動的に割り当てられます。私は少し問題を単純化しました[私はメモリを割り当てるためのスタブを持っていますが、C++ Testはfstreamクラスメソッドのスタブを作るのには役に立たない]。 – INS

+0

@ Iulian:動的割り当てがまだ失敗する可能性があります(たとえば、100 GBのメモリを要求した場合など)。制御していないデータとやり取りしている場合、処理できないデータをコードがどのように処理するかをテストする必要があります優雅にまたはちょうどクラッシュ?)。 –

+0

@ジョンRストローム:これは理論的には正しいですが、多くの場合は過剰です。私は1000行の生産コード+ 20 000行のテストコードを、独自の問題とバグを維持したくない。テストコードのテストを書く必要がありますか?複雑な関数をモックするのは簡単な作業ではありません。 –

5

私は短いサンプルテストファイルを探します。テストコードとともにソースコントロールにチェックインできます。私がそれをする理由は、あなたの関数の目的はファイルをロードすることであるので、これはあなたがテストすべきものです。

+0

はい、おそらくファイルを使用しているときに発生しないエラーを「シミュレート」する必要があります。私は実際の*ファイルシステムではいくつかのエラーをシミュレートすることができないことがあると思います。 – INS

+1

実際のファイルシステムでファイルリーダーのエラーをシミュレートすることが不可能な場合は、実際のファイルシステムでアプリケーションを実行するため、非常に不明瞭であるか、単純には起こりません。例外はシステムXで開発していて、システムYに固有のエラーをテストしたい場合です。すべてのことを考慮して、単体テストでファイルを嘲笑しませんが、実際のファイルを使ったテストから始まります。 –

2

私の提案:

この関数を呼び出す関数のスタブを作成します。

サンプルテストファイルを使用して、この特定の関数の単体テストを作成します。

スタブを使用しない統合テストを作成して、プロセス全体をテストします。

0

単体テストでは、テストしているコードの多く(コードカバレッジ)をカバーしながら、元の機能を可能な限り近似したいと思うのが一般的です。私が慣れていないスタブを除いて、あなたのファイルに間違ったファイル名が与えられていれば、行3を確実にしたいという例があります:

if(openfile(rStrFileName)== successfull)

この状況を正確に処理してfalseを返します。スタブでこれを行うことができれば、そうすることができます。私の場合は、サンプルのテストファイルを使用し、テストでそれを保存します。これは一般的な方法です。

実際にできるだけ近いところで機能をテストすることがポイントです。これにより、自動的にキャッチされて修正することができると予想できない多くの不思議なケースが保証されます。これは最初にユニットテストのポイントです。

1

fault injectionというテクニックを探していると思います。私は数年前にプログラムがまれにテストされたエラー条件(ファイル許可エラー、mallocが0を返すなど)になるようにしました。私はその名前を覚えていません。うまくいけばウィキペディアのリンクがあなたを始めさせるかもしれない。

+0

これは始まりです。私はC++でこれを行うことを期待しています。テスト – INS

1

正に、私はこの機能を2つに分割します。1つの関数はstd::istreamから読み取られ、ファイルを開き、ifstream(スマートポインタでヒープ割り当てされた可能性があります)を返します。その後、ifstreamの代わりにistringstreamを入力して最初のテストを簡単に行うことができます。後者はテストも簡単です。

関連する問題