あなたの例を取り上げて(少しリファクタリングして)、
assert(a + b, math.add(a, b));
助けにはならない:
math.add
内部の動作を理解し、
- エッジケースで何が起こるかを知っています。
それはほとんど言っているようです:
- メソッドの機能を知りたい場合は、数百行のソースコードを自分で確認してください(はい、何百ものLOCを含む
math.add
ことができます。以下を参照)。
- メソッドが正しく機能するかどうかわからない。期待値と実際の値の両方が私が本当に期待したものと異なっていても問題ありません。
これは、次のようなテストを追加する必要がないことも意味します。
assert(3, math.add(1, 2));
assert(4, math.add(2, 2));
どちらも助けにはならず、少なくとも、最初のアサーションを作成すると、2番目のアサーションは何の有用性ももたらしません。
代わりに、何について:
const numeric Pi = 3.1415926535897932384626433832795;
const numeric Expected = 4.1415926535897932384626433832795;
assert(Expected, math.add(Pi, 1),
"Adding an integer to a long numeric doesn't give a long numeric result.");
assert(Expected, math.add(1, Pi),
"Adding a long numeric to an integer doesn't give a long numeric result.");
これは自明であり、あなたとソースコードを後で保守する人の両方にとって非常に役立ちます。この人がmath.add
コードを単純化してパフォーマンスを最適化するためにわずかな変更を行い、次のようなテスト結果を見ると想像してください。
Test TestNumeric() failed on assertion 2, line 5: Adding a long numeric to an
integer doesn't give a long numeric result.
Expected value: 4.1415926535897932384626433832795
Actual value: 4
この人は、新しく変更されたメソッドが引数の順序に依存することをすぐに理解します。最初の引数が整数で、2番目の引数が長い数値の場合、結果は整数になりますが、長い数値が期待されます。
同様4.141592
に、最初のアサーションでの実際の値を取得することは自明です。メソッドが大きな精度を処理することが期待されていることはわかっていますが、実際には失敗します。
同じ理由で、次の2つのアサーションが一部の言語で意味をなす場合があります。
// We don't expect a concatenation. `math` library is not intended for this.
assert(0, math.add("Hello", "World"));
// We expect the method to convert every string as if it was a decimal.
assert(5, math.add("0x2F", 5));
また、どうですか:
assert(numeric.Infinity, math.add(numeric.Infinity, 1));
自明です:メソッドが無限を正しく処理できるようにする必要があります。ゴーイング無限大を超えてまたは例外をスローすることは予想される動作ではありません。
それとも、あなたの言語に応じて、これはより理にかなっていますか?
/**
* Ensures that when adding numbers which exceed the maximum value, the method
* fails with OverflowException, instead of restarting at numeric.Minimum + 1.
*/
TestOverflow()
{
UnitTest.ExpectException(ofType(OverflowException));
numeric result = math.add(numeric.Maximum, 1));
UnitTest.Fail("The tested code succeeded, while an OverflowException was
expected.");
}
How does unit testing work?
誰も本当に知りません:)