Как я тестирую блок-блок?

В последнее время это заставило меня гать...

Что такое рефакторинг?

Рефакторинг кода - это процесс реструктуризации существующего компьютерного кода - изменение факторинга - без изменения его внешнего поведения.

И как мы убеждаемся, что мы не нарушаем что-либо во время рефакторинга?

Перед рефакторингом раздела кода необходим надежный набор тестов с автоматическим модулем. Тесты используются для демонстрации того, что поведение модуля правильное перед рефакторингом.

Хорошо. Но как я могу продолжить, если обнаруживаю, что запах кода в модульных тестах сам? Скажем, метод тестирования, который делает слишком много? Как я могу убедиться, что я ничего не нарушаю при реорганизации модульных тестов?

Нужны ли мне какие-то мета-тесты? Является ли это модулями все время?

Или модульные тесты просто не подчиняются нормальным правилам рефакторинга?

Ответ 1

По моему опыту существует две причины для проверки тестов:

  • Обзор
  • Вы видели, как он терпит неудачу.

Оба эти действия - это действия, которые происходят при написании теста. Если вы держите тесты неизменными, вы можете продолжать доверять им.

Каждый раз, когда вы изменяете тест, он становится менее надежным.

Вы можете несколько смягчить эту проблему, повторив описанный выше процесс: просмотрите изменения в тестах и ​​временно измените Системный тест (SUT), чтобы вы могли увидеть, что тесты терпят неудачу , как ожидалось.

При изменении тестов не изменяйте SUT. Тесты и производственный код проверяют друг друга, поэтому отличается тем, что другой заблокированный безопасен.

Ответ 2

В связи с тем, что это более старая статья, в комментарии в комментарии, rel= "nofollow noreferrer" > TDD на практике. Поэтому, после обзора, я хотел бы бросить свои два цента.

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

Каждый раз, когда вы изменяете тест, он становится менее надежным.

Я использую слово "изменить". Что касается рефакторинга, такие слова, как изменение, изменение и т.д., Часто устраняются, поскольку они несут последствия, противоречащие рефакторингу.

Если вы измените тест в традиционном смысле, возникает риск того, что вы внесли изменения, сделавшие тест менее надежным.

Однако, если вы измените тест в смысле рефрактора, тогда тест должен быть не менее заслуживающим доверия.

Это возвращает меня к исходному вопросу:

Как я могу выполнить тесты рефакторинга?

Совершенно просто, так же, как и любой другой код - изолированно.

Итак, если вы хотите реорганизовать свои тесты, не изменяйте код, просто измените свои тесты.

Нужен ли мне тест для моих тестов?

Нет. На самом деле, Кент Бек рассматривает этот точный вопрос в своем интервью Full Stack Radio, говоря:

Ваш код является тестом для ваших тестов

Марк Семанн также отмечает это в своем ответе:

Тесты и производственный код держите друг друга под контролем, поэтому изменение одного при сохранении другого заблокированного является самым безопасным.

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

Ответ 3

Как я могу убедиться, что я ничего не нарушаю при рефакторинге модульных тестов?

Сохраняйте старые тесты в качестве ссылки.


Чтобы разработать: модульные тесты с хорошим охватом стоят своего веса в результатах. Вы не держите их за удивительную структуру программы или отсутствие дублирования; они по существу представляют собой набор полезных пар входов/выходов.

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

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

Ответ 4

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

когда вы тестируете рефакторинг, вы всегда можете использовать автоматический рефакторинг или другие "надежные" методы, такие как извлечение метода и т.д.

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