Каков предпочтительный подход в отношении модульного тестирования и дат? - PullRequest
1 голос
/ 06 июня 2011

У меня есть класс, который вычисляет дату, и мне интересно, как лучше это проверить. Я придумала два подхода и задаюсь вопросом о твоих мыслях о том, что лучше (и, конечно, о любых других гениальных идеях, которые у тебя могут быть).

Например, в моем коде, если условия не выполняются, возвращается дата по умолчанию: один год и один месяц с сегодняшнего дня.

Подход № 1: Дублируйте логику расчета даты в модульном тесте:

DateMidnight expectedDefaultDate = new DateMidnight().plusYears(1).plusMonths(1);
assertEquals(expectedDefaultDate , unit.getExpireDate());

Подход № 2: Введите «сегодня» как фиксированный момент времени и ожидаемую дату ответа жесткого кода:

DateMidnight fixedPointInTime = new DateMidnight(2011, 06, 05);
unit.setToday(fixedPointInTime);
DateMidnight expectedDefaultDate = new DateMidnight(2012, 07, 05);
assertEquals(expectedDefaultDate, unit.getExpireDate());

Я довольно разорван над этим. Я не очень разбираюсь в дублировании кода, но первый подход мне более понятен относительно того, что ожидается. Что бы вы использовали (если есть) и почему?

Ответы [ 5 ]

2 голосов
/ 06 июня 2011

ИМХО, юнит-тесты должны иметь следующие атрибуты:

  1. быть повторяемым
  2. тест "интересных" кейсов

С точки зрения дат, использование "сегодня" плохо, так как оно отличается каждый день, когда вы запускаете тест. «Интересные» случаи для дат обычно включают выходные, праздничные дни, конец месяца / года и т. Д.

Один пример, который меня укусил в прошлом: тесты на основе даты, которые работают до того, как за день до важного релиза вы работаете в выходные и находите множество тестов, которые (неожиданно) не срабатывают. Если вы работаете в выходные, у вас уже много стресса, и вам действительно не нужно сдавать экзамены, чтобы добавить «страха, неуверенности и сомнений»!

В заключение, не используйте "сегодня". Если вы действительно хотите проверять каждую дату, то не делайте это изо дня в день, вместо этого используйте ее для кода в тесте, выполняя цикл для диапазона дат, который простирается от фиксированной даты начала до даты, превышающей ожидаемое время жизни система (а затем и некоторые).

2 голосов
/ 06 июня 2011

Цель юнит-тестов - найти ошибки.Я предлагаю вам воспользоваться подходом, который, по вашему мнению, наиболее вероятно приведет к ошибке.Простое дублирование кода, возможно, не найдены все ошибки.Однако, если вы измените исходный код (например, чтобы сделать его более эффективным), пример больше не будет дублироваться.

ИМХО, лучше всего написать его в обоих направлениях, и любой из них может сломаться подизменения.

1 голос
/ 06 июня 2011

Второй подход лучше. Тестовый код должен быть очень простым и глупым, тестируемый код должен быть интеллектуальным и сложным. Если тестовый код слишком умен и тест не пройден, вы никогда не узнаете, есть ли ошибка в тестируемом коде или в тестовом коде.

0 голосов
/ 06 июня 2011

Кажется, что здесь есть две вещи для проверки:

  1. Класс правильно рассчитывает один месяц и один год с сегодняшнего дня
  2. Дата возврата одного года и одного месяца с сегодняшнего дняпри определенных обстоятельствах.

Очевидно, что для # 1 вам нужно использовать жестко закодированные значения.Что касается последнего, теперь вы можете повторить код.

Просто моя мысль, хотя мне интересно, что это придирки.

0 голосов
/ 06 июня 2011

Во втором случае не только дублирование кода, но и жесткое кодирование данных.Я предпочитаю первый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...