4

C++コードの単体テストにParasoftのC++Testを使用しています。私は次の問題に遭遇しました。次の関数(擬似コード)に似た関数があります:

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 ++ Testで実行する場合に最適ですが、必須ではありません)。

4

6 に答える 6

7

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

于 2009-07-10T19:08:44.067 に答える
5

この関数の単体テストでは、呼び出された関数ごとにスタブを使用する必要があります。

呼び出された各関数には、その関数を実行する独自のユニットテストスイートがあります。

の場合read_entire_file_to_buffer()、バッファを大量にオーバーフローする少なくとも1つのテストファイルが必要です。これは、期待していた40文字の構成ファイルではなく、ニューヨーク証券取引所の履歴が提供されたときにクラッシュして燃えないことを確認するためです。

于 2009-07-10T19:51:42.453 に答える
2

私のおすすめ:

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

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

プロセス全体をテストするためのスタブなしの統合テストを作成します。

于 2009-07-10T19:09:28.153 に答える
1

フォールトインジェクションと呼ばれるテクニックをお探しだと思います。数年前に、プログラムがめったにテストされないエラー状態(ファイルパーミッションエラー、mallocが0を返すなど)になるプロジェクトを見ました..名前を思い出せません。うまくいけば、ウィキペディアのリンクがあなたを始めることができます。

于 2009-07-10T19:47:29.090 に答える
1

正直なところ、この関数を2つに分割します。1つの関数はから読み取り、std::istreamもう1つはファイルを開いて、を返しますifstream(おそらく、スマートポインターによってヒープに割り当てられた関数)。次に、のistringstream代わりにを指定することで、最初のユニットテストを簡単に行うことができifstreamます。後者も簡単にテストできるはずです。

于 2009-07-10T20:20:10.243 に答える
0

単体テストでは、テストしているコード(コードカバレッジ)をできるだけ多くカバーしながら、元の機能を可能な限り模倣することをお勧めします。私がよく知らないスタブは別として、例としては、ファイルの3行目など、間違ったファイル名が指定されている場合に、それを確認したい場合があります。

if(openfile(rStrFileName)== successl)

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

重要なのは、できるだけ現実に近い機能をテストすることです。これにより、予期できない多くの奇妙なケースが自動的にキャッチされるため、修正することができます。これが、最初の単体テストのポイントです。

于 2009-07-10T19:38:37.283 に答える