0

2つの期間が交差するかどうかを判断するための次のコードがあり、それが正しいことを証明したかった:

public static bool Intersect(this DateTime start1, DateTime end1, DateTime start2, DateTime end2)
{
    return (start1 == start2) || (start1 > start2 ? start1 <= end2 : start2 <= end1);
}

数回試行した後、私が思いついた最善の方法は、ハードコードされた値の束をそれに投げ込むことです。

その研究を行う過程で、私はこの問題に対するSOの答えを発見しました。これは、次の非常に単純な構文を使用しています

return (StartA <= EndB) and (EndA >= StartB) 

いずれにせよ、日付交差メソッドを単体テストする最も効果的な方法は何か教えてもらえますか?

4

2 に答える 2

1

説明から、2つの日付範囲があります

1)Start1 ... End1

2)Start2 ... End2

そして、それらが重なっているかどうかを確認したい

だから、可能性は何ですか

A)エラーケース

End1 < Start1
End2 < Start2

B)正確なオーバーラップ

Start1 == Start2, End1 == End2, Start1 == End1
Start1 == Start2, End1 == End2, Start1 < End1

C)重複なし

Start1 < End1 < Start2 < End2
Start1 == End1 < Start2 < End2
Start1 < End1 < Start2 == End2
Start1 == End1 < Start2 == End2

D)完全なオーバーラップ

Start1 == Start2 < End2 < End1
Start1 == Start2 == End2 < End1
Start1 < Start2 < End2 < End1
Start1 < Start2 == End2 < End1
Start1 < Start2 < End2 == End1
Start1 < Start2 == End2 == End1

E)部分的なオーバーラップ

Start1 < Start2 < End1 < End2

それがたくさんだと思います。範囲が正しいことを前提としています(Start1 <= Start2)。
最初に2番目の範囲を渡して、ケースを2倍にする必要がある場合があります。答えは同じである必要があります(重複は順序に依存しません)が、実装が暗黙的に(Start1 <= Start2)に依存し、日付が逆に入力された場合に失敗する可能性があります。

上記のそれぞれがテストケースになります。
注:長さ0(開始==終了)の範囲が許可されていない場合、それらはエラーケースになり、他のセクションから削除できます。

単純な関数のテストケースはたくさんありますが、4つの変数(各日付)があり、それらの間の一連の関係と関係の組み合わせごとに異なる答えが得られます。

これを徹底的にテストする価値があるかどうか、または最も一般的で「アルゴリズムの問​​題を引き起こす可能性が最も高い」(非常に主観的な)ケースを選択するだけで十分かどうかを判断する必要があります。

これがあなたが探していたものであり、役立つことを願っています、
アラン。

于 2012-04-25T09:54:44.003 に答える
0

可能な入力値のすべての組み合わせを使用してメソッドをテストする必要があります。このようにして、有効な入力だけでなく、無効な入力もテストします。有効な(予期される)入力と無効な(予期しないが可能性のある)入力を説明するサンプル入力値を使用します。これは、コードが意図したとおりに機能することを証明できるように、一般的にテストを行う方法です。

于 2012-04-25T02:29:05.180 に答える