5

モックを使用してアルゴリズムをテストしたいと思います。アルゴリズム(現在の実装では)は、複数のパスでコンテナクラスを反復処理し、そこからset()sとget()sの値を取得します。テストの目的は、コンテナに保存されている最終結果を確認することです。最終的な値は、パスの間に読み書きされる値によって異なります。たとえば、任意の要素の値は、アルゴリズムが終了するまで複数回変更される可能性があり、ほとんどの場合、反復nの結果としての値は、反復n-1後の値に依存します。

私はモックのアイデアが好きで、計算が終了したときだけでなく、発生したアルゴリズムの誤った動作を検証できるので、上記のシナリオでそれらを使用したいと思います。ただし、これが実際に良いアイデアであるかどうかはわかりません。これは、モックの期待値を現在の実装に近づける必要があるためです(たとえば、 "expect get(element n)and return x、then set(要素n、値x + 1)、別のget(n)、x + 1を返し、set(n、x + 2)などを期待します。 ")

中間値が期待どおりであることを確認できますが、そのような期待はテストの目的と矛盾し(アルゴリズムが正しい最終値を計算することを確認します)、実装が変更された場合、最終的な値。

今私の質問:私は何かが欠けていますか?それにもかかわらず、このシナリオでモックを使用する良い方法はありますか?それとも、ここでそれらを使用することは単に意味がありませんか?他の人はこの問題にどのように対処しますか?

最後のコメント:私はc ++コードをテストし、googlemockを使用することについて話しているのですが、それがあなたの答えに何か違いをもたらすのであれば。

ps:ここでグーグルと記事をチェックしました(特に反復的な振る舞いをモックする-戻り値を増やすという問題にのみ取り組んでいます)が、問題に近いものは見つかりませんでした。

4

3 に答える 3

3

アルゴリズムの最終出力の単体テストを作成します。プログラムの他の部分が利用するので、自動テストで期待される結果を検証する必要があります。

アルゴリズムコード内の個々のステップをテストする限り、これはデバッガーを使用してステップスルーするための仕事であり、自動テストではありません。アルゴリズムの内部動作を確認するのは1回限りのことであり、一度正しく実行すると、アルゴリズム内の個々のステップをテストし続ける必要はありません。

于 2011-09-12T14:27:08.980 に答える
1

ユニットテストは、アルゴリズムを構成する小さな部分により適しています。

そうは言っても、単体テストツールはそのようにアルゴリズムを開発するのに非常に役立ちます。それらは使用するのにまったく悪いことではありません。それらがもう有効でない場合は、それらを保持しないでください。通常、統合テストでは各反復をテストせず、結果をテストするだけです。ただし、そのようにアルゴリズムを開発することが役立つ場合は、それを選択してください。

あなたはモックについて正しいです、あなたは実際に多くをテストしていません。ただし、一部の入力を制御する場合に役立ちます。制御できないブラックボックスがある場合、入力を徹底的に並べ替えることがよくあります。ただし、これらの種類のテストは実行時間が長すぎます。それらがソース管理に入るとき、私は一般的にそれらを完全にまたは部分的にコメントアウトします。

于 2011-09-12T14:27:53.457 に答える
1

コンテナが何らかの形で遅い場合や、コンテナを邪魔せずに値を読み取ることができないという副作用がある場合は、モックを使用する必要があります。

そうでなければ、モックを使用することは時間の無駄です。のモックバージョンを使用しますstd::vectorか?私はしません。それはばかげているでしょう。

単体テストでは、さまざまなパブリックパラメータを使用してアルゴリズムの内部状態をすべてテストできない場合、それらの状態は実際には重要ではありません。それらは実際に使用されることは決してありません。入力パラメータの各セットのアルゴリズムから正しい最終的な答えが得られる限り、物事はうまく機能していると言えます。

于 2011-09-12T15:37:30.227 に答える