2

タイムスタンプが週末、つまり土曜日または日曜日の場合に true または false を返す小さなメソッドがあります。

今、私は単体テストに非常に慣れていないので、このための単体テストを作成しようとしています。

私のテストケースでは、どのように進めますか:

これが私の最初の考えです。

1. Pick any 1 week from the past and then...
   1.1. Get a timestamp for all 5 week days (mon through fri) and pass each timestamp to the function being tested.  If they all return false then proceed...
   1.2  Get the timestamp for both weekend days and pass each to function being tested.  If they both return true then we know the function is correct.

また

2  Simply pick 1 weekday from the past and 1 weekend day from the past and test with only those 2 dates

これらのアプローチのいずれかで正しいですか、これをテストするより良い方法はありますか?

4

2 に答える 2

2

これには、1つまたは 2 つのデータ プロバイダーが必要です。PHPUnit は最初にデータ プロバイダーを呼び出して、テストに渡すデータ セットを含む配列を取得します。各データ セットは、テスト メソッドに渡すパラメーターの配列です。次に、データセットごとに 1 回テストを実行します。ここで、各データ セットは単純な日付文字列と、エラー メッセージの曜日の名前になります。

/**
 * @dataProvider weekdays
 */
function testDetectsWeekdays($date, $day) {
    self::assertTrue($fixture->isWeekday($date), $day);
}

/**
 * @dataProvider weekends
 */
function testDetectsWeekends($date, $day) {
    self::assertFalse($fixture->isWeekday($date), $day);
}

function weekdays() {
    return array(
        array('2012-08-20', 'Monday'),
        array('2012-08-21', 'Tuesday'),
        array('2012-08-22', 'Wednesday'),
        array('2012-08-23', 'Thursday'),
        array('2012-08-24', 'Friday'),
    );
}

function weekends() {
    return array(
        array('2012-08-25', 'Saturday'),
        array('2012-08-26', 'Sunday'),
    );
}

テストする日付に関しては、クラスで発生する可能性のある特殊なケースについて考える必要があります。うるう年は影響しますか?時間帯?ユニット (ホワイト ボックス) テストの一部である実装に依存します。

于 2012-08-25T19:28:06.770 に答える
1

複数のチェックを 1 つのテストに入れると、最初のチェックの 1 つが失敗したときに、いくつかのチェックが何を返すかがわからないという問題が発生します。メソッドが 3 日目に失敗したとします。4日目はうまくいくでしょうか?この情報は、バグを見つけようとするときに非常に役立ちます。

私のアプローチは、すべての値を一度にテストすることです。それはこのように動作します:

  1. 過去の日付を選択してください
  2. 日付を1日8回進めるループを作る
  3. 各日付に対してメソッドを呼び出し、結果を文字列に追加します
  4. 実際のカレンダーを見て、期待される結果の文字列を作成します)
  5. 2 つの文字列を比較する

このようにして、メソッドが失敗した日付を一目で確認できます。

もう 1 つのオプションは、8 つのテストを作成し、各テストで 1 つの日付をチェックすることです。

ヒント: タイムゾーンが導入されると、このようなテストは失敗する傾向があります。真夜中に近いタイムスタンプを使用し、タイムゾーンで遊ぶテストをさらに作成します。結果はまだ正しいですか?

于 2012-08-24T12:25:18.487 に答える