1

以下は、単体テストに必要なコードです。の単体テスト ケースと の単体テスト ケースを 2getFooつ作成true(x==5)false(x==10)ます。convertWrapper私の質問は、true と false の場合でも、2 つの単体テスト関数を記述する必要があるかどうかです。私の意見では、将来、誰かが convertWrapper を変更してリグレッションを引き起こさないようにする必要があります。しかし、そのような場合に広く採用されている慣行とは何を考えているのだろうか。

public boolean getFoo(int x) {
    return x == 5;
}

public boolean convertWrapper(char ch) {
    int x = (int)ch;
    return getFoo(x);
}
4

5 に答える 5

2

自問してみてください - の一般契約とは何ですかconvertWrapper。特定の入力に対して true を返し、他の入力に対して false を返す場合は、それが行われることをテストします。実装されているという事実は、getFoo単体テストの方法とは無関係です。

将来誰かが以前と同じ入力に対して true または false を返すように実装を変更しても、それgetFooを使用しない場合、テストは中断されません。

公開されているためgetFoo、独自のテストが必要です。

于 2013-11-15T02:14:41.327 に答える
2

1 つのオプション: convertWrapper が確実に getFoo を呼び出して結果を返すようにし、getFoo の単体テストを行います。

モックは、そのような統合テストを行うのに役立ちます。

于 2013-11-15T02:10:25.623 に答える
2

ベスト プラクティスは、一般的に単体テストを作成することです。それらはシンプルで維持しやすいものでなければなりません。複数のテスト方法を使用することが最も簡単で維持しやすい場合は、それを行います。一般に、私は単体テストで定型コードをあまり書かないようにしています。

于 2013-11-15T02:10:49.580 に答える
1

はい、おそらく個別のケースを書きたいと思うでしょう。なぜなら、あなたの意見は一般的に正しく、まさに適切なテストが避けるべき状況のタイプであるためです。

私の意見では、将来誰かが convertWrapper を変更して回帰を引き起こさないようにする必要があります。

単体テストでは、コードの高レベルの機能をテストする必要があります。単体テストは実装の詳細を認識せず、「契約」の条件が満たされていることのみをテストします。大まかに言うと、2 つの別々のことを行う 2 つのパブリック メソッドがあるため (要件は記述も文書化もされていないと推測されます)、2 つの別々のテストがあります。

開発者として、実装が同じであることを暗黙のうちに知っているため、テストの 1 つを削除すると、実装の詳細に関する情報がテスト領域に突然もたらされ、将来の問題や回帰が求められます。

Dave Newton が彼の回答で指摘したオプションの 1 つは、convertWrapper(ch) == getFoo((int)ch)関連するすべてのch. これは素晴らしい提案であり、非常に適切かもしれませんが、高レベルの要件がconvertWrapper「と同じ値を返す」という場合に限られますgetFoo。繰り返しますが、テストには要件が反映されている必要があります。

もちろん、検査を廃止することが法律に違反するという意味ではありません。あなたがそれをしたとしても、悪魔は必ずしもあなたの魂を主張するとは限りません(ただし、それが通常の結果であることを願うこともあります)。アプリケーションがかなり単純な場合、または関連するリスクを受け入れる意思がある場合は、単純な「@todo Test me」ドキュメント マーカーで十分に対処できる可能性があります。時々近道をするのは問題ありませんが、その影響を本当に理解し、受け入れる場合に限ります。自分自身から自分を救うことができるのは自分だけです。:)

しかし、一般的なケースでは、はい、2 つのテストです。その後、テストを「起動して忘れる」ことができ、将来作成したルールの特別な例外を覚えておく必要はありません。

于 2013-11-15T02:12:37.233 に答える
0

の単体テストを 2 つだけ書く必要があるのはなぜだと思いますgetFooか?

もちろん、メソッドは実際には 2 つの方法のいずれかしか実行できないことはわかっていますが、呼び出し元はそうではありません。このような些細なメソッドではばかげているように思えるかもしれませんが、メソッドのコントラクトの観点から考える必要があります。おそらく、5、0、負の数、非常に大きな正の数、または発信者が処理できると期待するその他の奇妙なケースでテストする必要があります。

と同様convertWrapper。それが呼び出しgetFoogetFoo実際には 2 つのパスしかないことはわかっていますが、そのように考えることはできません。

肝心なのは、メソッドのコントラクトを定義し、パブリック メソッドがそのコントラクトを満たしていると確信できる十分なテストを実行する必要があるということです。

于 2013-11-15T02:24:20.367 に答える