Использование старого кода для проверки результатов модульных тестов - PullRequest
1 голос
/ 31 июля 2009

Допустим, я заменяю более сложный метод гораздо более простой реализацией, которая, как я считаю, делает то же самое.

Имеет ли смысл для меня копировать старый код в класс с моими модульными тестами, чтобы я мог утверждать, что результат обоих одинаков?

Спасибо

Ответы [ 5 ]

5 голосов
/ 31 июля 2009

Да. Это хороший способ начать.

Но не останавливайтесь на достигнутом.

Также напишите тест, имеющий "окончательный ответ", который использовался для создания старого кода.

В какой-то момент вы захотите удалить старый код из ваших модульных тестов, потому что он неправильный и не поддерживается

4 голосов
/ 31 июля 2009

Предполагая, что вы используете систему контроля версий, вот что я бы сделал:

  1. Напишите тесты для старого кода.
  2. Убедитесь, что испытания пройдены.
  3. Проверьте это в системе контроля версий.
  4. Теперь, как Отдельное изменение, заменить реализация (т.е. добавить новый внедрение и удаление старых реализации) и убедитесь, что тесты еще проходят.

В рамках шага 1 вы можете захотеть написать небольшую "привязь" для старого кода, чтобы вы могли видеть, какие значения он выдает, если ваша основная цель - просто сохранить существующее поведение. Важно то, что у вас есть тесты, которые проходят старую реализацию.

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

2 голосов
/ 31 июля 2009

имеет смысл

сначала напишите тесты

и убедитесь, что старый код проходит их, прежде чем переписывать его

затем замените старый код новым кодом и убедитесь, что он проходит те же тесты

2 голосов
/ 31 июля 2009

Определенно нет. У вас должны быть тесты для каждого случая, граничных условий, ошибок и т. Д., Которые обрабатывает старый код. Если ваши тесты хороши, ваш новый код будет эквивалентен, когда тесты пройдут.

Возможность уверенного рефакторинга и устранения старого кода является одним из основных преимуществ модульного тестирования.

1 голос
/ 31 июля 2009

Вы также можете заставить свой тест утверждать, что оба метода возвращают одно и то же значение. Что-то вроде

Assert.equals(oldMethod(someInput), newMethod(someInput));

Тогда вы могли бы медленно «освободиться» от старого метода.

...